{
  "Global": [
    {
      "Id": 825712380,
      "Name": "OnEntitySaved",
      "FullName": "OnEntitySaved",
      "Category": "Global",
      "Parameters": [
        {
          "name": "networkable",
          "typeName": "BaseNetworkable",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "BaseNetworkable+SaveInfo",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an entity's state is serialized and written to the save stream."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ToStream(System.IO.Stream stream, BaseNetworkable.SaveInfo saveInfo)\n{\n\tusing (saveInfo.msg = Facepunch.Pool.Get<ProtoBuf.Entity>())\n\t{\n\t\tSave(saveInfo);\n\t\tif (saveInfo.msg.baseEntity == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(this?.ToString() + \": ToStream - no BaseEntity!?\");\n\t\t}\n\t\tif (saveInfo.msg.baseNetworkable == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(this?.ToString() + \": ToStream - no baseNetworkable!?\");\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"IOnEntitySaved\", this, saveInfo);\n\t\tsaveInfo.msg.WriteToStream(stream);\n\t\tPostSave(saveInfo);\n\t}\n}\n",
      "ParametersText": "BaseNetworkable networkable, BaseNetworkable.SaveInfo info",
      "TargetName": "BaseNetworkable",
      "MethodName": "ToStream",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2025192851,
      "Name": "OnLoseCondition",
      "FullName": "OnLoseCondition",
      "Category": "Global",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "amount",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an item's condition is reduced or it breaks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnLoseCondition(Item item, float amount)\n{\n\tobject[] array = Carbon.HookCaller.Caller.AllocateBuffer(2);\n\tarray[0] = item;\n\tarray[1] = amount;\n\tCarbon.HookCaller.CallStaticHook(2025192851u, array);\n\tamount = (float)array[1];\n\tCarbon.HookCaller.Caller.ReturnBuffer(array);\n\tfloat condition = item.condition;\n\titem.condition -= amount;\n\tif (item.condition <= 0f && item.condition < condition)\n\t{\n\t\titem.OnBroken();\n\t}\n\treturn Carbon.Cache.True;\n}\n",
      "ParametersText": "Item item, float amount",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnLoseCondition",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 39952195,
      "Name": "OnConsoleCommand",
      "FullName": "OnConsoleCommand",
      "Category": "Global",
      "Parameters": [],
      "Flags": 9,
      "Descriptions": [
        "Called when a console command is executed on the server."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static ConsoleSystem.CommandResult RunWithResult(ConsoleSystem.Option options, string strCommand, params object[] args)\n{\n\tLastError = null;\n\tstring text = BuildCommand(strCommand, args);\n\tConsoleSystem.Arg arg = new ConsoleSystem.Arg(options, text);\n\tbool flag = arg.HasPermission();\n\tif (!arg.Invalid && flag)\n\t{\n\t\tConsoleSystem.Arg currentArgs = CurrentArgs;\n\t\tCurrentArgs = arg;\n\t\tbool flag2 = Internal(arg);\n\t\tCurrentArgs = currentArgs;\n\t\tif (options.PrintOutput && flag2 && arg.Reply != null && arg.Reply.Length > 0)\n\t\t{\n\t\t\tUnityEngine.DebugEx.Log(arg.Reply);\n\t\t}\n\t\tif (loggingEnabled)\n\t\t{\n\t\t\tLogToFile(arg);\n\t\t}\n\t\treturn new ConsoleSystem.CommandResult(ConsoleSystem.CommandResultType.Success, arg.Reply, arg.cmd);\n\t}\n\tLastError = \"Command not found\";\n\tConsoleSystem.CommandResultType result = ConsoleSystem.CommandResultType.CommandNotFound;\n\tif (!flag)\n\t{\n\t\tLastError = \"Permission denied\";\n\t\tresult = ConsoleSystem.CommandResultType.PermissionDenied;\n\t}\n\tif (!options.IsServer && (!options.ForwardtoServerOnMissing || !SendToServer(text)))\n\t{\n\t\tLastError = \"Command '\" + strCommand + \"' not found\";\n\t\tif (options.PrintOutput && !ignoredCommands.Contains(strCommand))\n\t\t{\n\t\t\tUnityEngine.DebugEx.Log(LastError);\n\t\t}\n\t\treturn new ConsoleSystem.CommandResult(ConsoleSystem.CommandResultType.CommandNotFound, null, null);\n\t}\n\tif (options.IsServer && options.PrintOutput)\n\t{\n\t\tLastError = \"Command '\" + strCommand + \"' not found\";\n\t\tif (!ignoredCommands.Contains(strCommand))\n\t\t{\n\t\t\tUnityEngine.DebugEx.Log(LastError);\n\t\t}\n\t}\n\treturn new ConsoleSystem.CommandResult(result, null, null);\n}\n",
      "ParametersText": "",
      "TargetName": "ConsoleSystem",
      "MethodName": "RunWithResult",
      "AssemblyName": "Facepunch.Console",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3740958730,
      "Name": "OnRconCommand",
      "FullName": "OnRconCommand",
      "Category": "Global",
      "Parameters": [
        {
          "name": "ip",
          "typeName": "System.Net.IPAddress",
          "optional": false
        },
        {
          "name": "command",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "arguments",
          "typeName": "System.String[]",
          "optional": false
        }
      ],
      "Flags": 9,
      "Descriptions": [
        "Called when an RCON command is received from a remote client.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private static void OnCommand(Facepunch.RCon.Command cmd)\n{\n\ttry\n\t{\n\t\tresponseIdentifier = cmd.Identifier;\n\t\tresponseConnection = cmd.ConnectionId;\n\t\tisInput = true;\n\t\tif (Print)\n\t\t{\n\t\t\tUnityEngine.Debug.Log(\"[rcon] \" + cmd.Ip?.ToString() + \": \" + cmd.Message);\n\t\t}\n\t\tisInput = false;\n\t\ttimer.Restart();\n\t\tstring text = ConsoleSystem.Run(ConsoleSystem.Option.Server.Quiet().FromRconConnection(cmd.ConnectionId, cmd.Ip.ToString(), cmd.Name), cmd.Message);\n\t\ttimer.Stop();\n\t\tSystem.TimeSpan elapsed = timer.Elapsed;\n\t\tif (Facepunch.Rust.Profiling.RconProfiler.mode > 0)\n\t\t{\n\t\t\tFacepunch.Rust.Profiling.RconProfiler.ExecutionTime += elapsed;\n\t\t}\n\t\tif (elapsed > Facepunch.Rust.Profiling.RuntimeProfiler.RconCommandWarningThreshold)\n\t\t{\n\t\t\tFacepunch.Rust.Profiling.LagSpikeProfiler.RconCommand(timer.Elapsed, cmd.Message);\n\t\t}\n\t\tif (text != null)\n\t\t{\n\t\t\tOnMessage(text, string.Empty, UnityEngine.LogType.Log);\n\t\t}\n\t}\n\tfinally\n\t{\n\t\tresponseIdentifier = 0;\n\t\tresponseConnection = -1;\n\t}\n}\n",
      "ParametersText": "System.Net.IPAddress ip, string command, string[] arguments",
      "TargetName": "Facepunch.RCon",
      "MethodName": "OnCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 352240293,
      "Name": "OnServerInitialized",
      "FullName": "OnServerInitialized",
      "Category": "Global",
      "Parameters": [
        {
          "name": "initialized",
          "typeName": "System.Boolean",
          "optional": true
        }
      ],
      "Flags": 9,
      "Descriptions": [
        "Called when the server finishes initializing networking and game services.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OpenConnection(bool useSteamServer = true)\n{\n\tif (ConVar.Server.queryport <= 0 || ConVar.Server.queryport == ConVar.Server.port)\n\t{\n\t\tConVar.Server.queryport = System.Math.Max(ConVar.Server.port, Facepunch.RCon.Port) + 1;\n\t}\n\tNetwork.Net.sv.ip = ConVar.Server.ip;\n\tNetwork.Net.sv.port = ConVar.Server.port;\n\tNetwork.Net.sv.encryption = ConVar.Server.encryption;\n\tint num = Facepunch.Application.Manifest?.Features?.MinimumSecureEncryption ?? 2;\n\tif (Facepunch.CommandLine.HasSwitch(\"-insecure\"))\n\t{\n\t\tNetwork.Net.sv.secure = false;\n\t\tNetwork.Net.sv.encryption = UnityEngine.Mathf.Clamp(ConVar.Server.encryption, 0, 1);\n\t}\n\tif (Network.Net.sv.secure && Network.Net.sv.encryption < num)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"A server requires a minimum 'encryption' value of {num} to be secure and visible in the server browser. To remain secure, increase your 'encryption' convar to {num} and restart your server.\");\n\t\tNetwork.Net.sv.secure = false;\n\t}\n\tif (useSteamServer)\n\t{\n\t\tStartSteamServer();\n\t}\n\telse\n\t{\n\t\tPlatformService.Instance.Initialize(RustPlatformHooks.Instance);\n\t}\n\tif (!Network.Net.sv.Start(this))\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Couldn't Start Server.\");\n\t\tCloseConnection();\n\t\treturn;\n\t}\n\tNetwork.Net.sv.cryptography = new NetworkCryptographyServer();\n\tEACServer.DoStartup();\n\tInvokeRepeating(\"DoTick\", 1f, 1f / (float)ConVar.Server.tickrate);\n\tInvokeRepeating(\"DoHeartbeat\", 1f, 1f);\n\trunFrameUpdate = true;\n\tConsoleSystem.OnReplicatedVarChanged += OnReplicatedVarChanged;\n\tOxide.Core.Interface.CallHook(\"IOnServerInitialized\");\n}\n",
      "ParametersText": "bool initialized = default",
      "TargetName": "ServerMgr",
      "MethodName": "OpenConnection",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 938254961,
      "Name": "OnNativeCommandHasPermission",
      "FullName": "OnNativeCommandHasPermission",
      "Category": "Global",
      "Parameters": [
        {
          "name": "arg",
          "typeName": "ConsoleSystem+Arg",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to check whether a user has permission to run a native console command.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "",
      "ParametersText": "ConsoleSystem.Arg arg",
      "TargetName": "ConsoleSystem+Arg",
      "MethodName": "HasPermission",
      "AssemblyName": "Facepunch.Console",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2827558490,
      "Name": "CanPatrolHeliSeePlayer",
      "FullName": "CanPatrolHeliSeePlayer",
      "Category": "Global",
      "Parameters": [
        {
          "name": "heli",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to check whether the patrol helicopter has line???of???sight to the player.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public bool PlayerVisible(BasePlayer ply)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanHelicopterTarget\", this, ply);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tusing (TimeWarning.New(\"PatrolHelicoperAI.PlayerVisible\"))\n\t{\n\t\tUnityEngine.Vector3 position = ply.eyes.position;\n\t\tif (ply.eyes.position.y < WaterSystem.OceanLevel && UnityEngine.Mathf.Abs(WaterSystem.OceanLevel - ply.eyes.position.y) > oceanDepthTargetCutoff)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (TOD_Sky.Instance.IsNight && UnityEngine.Vector3.Distance(position, interestZoneOrigin) > 40f)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tUnityEngine.Vector3 vector = base.transform.position - UnityEngine.Vector3.up * 6f;\n\t\tfloat num = UnityEngine.Vector3.Distance(position, vector);\n\t\tUnityEngine.Vector3 normalized = (position - vector).normalized;\n\t\tif (GamePhysics.Trace(new UnityEngine.Ray(vector + normalized * 5f, normalized), 0f, out var hitInfo, num * 1.1f, 1218652417) && UnityEngine.GameObjectEx.ToBaseEntity(hitInfo.collider.gameObject) == ply)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n",
      "ParametersText": "PatrolHelicopterAI heli, BasePlayer player",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "PlayerVisible",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2434163304,
      "Name": "CanPickupAllFromRack",
      "FullName": "CanPickupAllFromRack",
      "Category": "Global",
      "Parameters": [
        {
          "name": "rack",
          "typeName": "WeaponRack",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "mountSlotIndex",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to check whether the player can take all weapons from a weapon rack.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "private void GivePlayerAllWeapons(BasePlayer player, int mountSlotIndex)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex != null)\n\t{\n\t\tGivePlayerWeapon(player, weaponAtIndex.GridSlotIndex);\n\t}\n\tfor (int num = gridSlots.Length - 1; num >= 0; num--)\n\t{\n\t\tWeaponRackSlot weaponRackSlot = gridSlots[num];\n\t\tif (weaponRackSlot.Used)\n\t\t{\n\t\t\tGivePlayerWeapon(player, weaponRackSlot.GridSlotIndex, -1, tryHold: false);\n\t\t}\n\t}\n\tItemManager.DoRemoves();\n\tSendNetworkUpdateImmediate();\n}\n",
      "ParametersText": "WeaponRack rack, BasePlayer player, int mountSlotIndex",
      "TargetName": "WeaponRack",
      "MethodName": "GivePlayerAllWeapons",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2780342367,
      "Name": "CanPickupFromRack",
      "FullName": "CanPickupFromRack",
      "Category": "Global",
      "Parameters": [
        {
          "name": "rack",
          "typeName": "WeaponRack",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "mountSlotIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "playerBeltIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "tryHold",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to check whether the player can take a specific weapon from a weapon rack.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "private void GivePlayerWeapon(BasePlayer player, int mountSlotIndex, int playerBeltIndex = -1, bool tryHold = true, bool sendUpdate = true)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex == null)\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponTake\", slot, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tClearSlot(weaponAtIndex);\n\tbool flag = false;\n\tbool flag2 = true;\n\tif (slot.IsBackpack())\n\t{\n\t\tflag2 = false;\n\t\tif (slot.info.GetComponent<ItemModBackpack>() != null && player.inventory.GetAnyBackpack() == null)\n\t\t{\n\t\t\tflag = slot.MoveToContainer(player.inventory.containerWear);\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\tflag = slot.MoveToContainer(player.inventory.containerBelt, playerBeltIndex);\n\t}\n\tif (flag)\n\t{\n\t\tif (flag2 && ((tryHold && player.GetHeldEntity() == null) || playerBeltIndex != -1))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"SetActiveBeltSlot\", player), slot.position, slot.uid);\n\t\t}\n\t\tClientRPC(RpcTarget.Player(\"PlayGrabSound\", player), slot.info.itemid);\n\t}\n\telse if (!slot.MoveToContainer(player.inventory.containerMain))\n\t{\n\t\tslot.Drop(base.inventory.dropPosition, base.inventory.dropVelocity);\n\t}\n\tif (sendUpdate)\n\t{\n\t\tItemManager.DoRemoves();\n\t\tSendNetworkUpdateImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnRackedWeaponTaken\", slot, player, this);\n}\n",
      "ParametersText": "WeaponRack rack, BasePlayer player, Item item, int mountSlotIndex, int playerBeltIndex, bool tryHold",
      "TargetName": "WeaponRack",
      "MethodName": "GivePlayerWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1860967996,
      "Name": "CanPlaceOnRack",
      "FullName": "CanPlaceOnRack",
      "Category": "Global",
      "Parameters": [
        {
          "name": "rack",
          "typeName": "WeaponRack",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "gridCellIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "rotation",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to place on rack.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "private void MountWeapon(BasePlayer player, int gridCellIndex, int rotation)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tHeldEntity heldEntity = player.GetHeldEntity();\n\tif (!(heldEntity == null))\n\t{\n\t\tItem item = heldEntity.GetItem();\n\t\tif (item != null)\n\t\t{\n\t\t\tMountWeapon(item, player, gridCellIndex, rotation);\n\t\t}\n\t}\n}\n",
      "ParametersText": "WeaponRack rack, BasePlayer player, Item item, int gridCellIndex, int rotation",
      "TargetName": "WeaponRack",
      "MethodName": "MountWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3671231874,
      "Name": "OnPickupFromRack",
      "FullName": "OnPickupFromRack",
      "Category": "Global",
      "Parameters": [
        {
          "name": "rack",
          "typeName": "WeaponRack",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "mountSlotIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "playerBeltIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "tryHold",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "private void GivePlayerWeapon(BasePlayer player, int mountSlotIndex, int playerBeltIndex = -1, bool tryHold = true, bool sendUpdate = true)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex == null)\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponTake\", slot, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tClearSlot(weaponAtIndex);\n\tbool flag = false;\n\tbool flag2 = true;\n\tif (slot.IsBackpack())\n\t{\n\t\tflag2 = false;\n\t\tif (slot.info.GetComponent<ItemModBackpack>() != null && player.inventory.GetAnyBackpack() == null)\n\t\t{\n\t\t\tflag = slot.MoveToContainer(player.inventory.containerWear);\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\tflag = slot.MoveToContainer(player.inventory.containerBelt, playerBeltIndex);\n\t}\n\tif (flag)\n\t{\n\t\tif (flag2 && ((tryHold && player.GetHeldEntity() == null) || playerBeltIndex != -1))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"SetActiveBeltSlot\", player), slot.position, slot.uid);\n\t\t}\n\t\tClientRPC(RpcTarget.Player(\"PlayGrabSound\", player), slot.info.itemid);\n\t}\n\telse if (!slot.MoveToContainer(player.inventory.containerMain))\n\t{\n\t\tslot.Drop(base.inventory.dropPosition, base.inventory.dropVelocity);\n\t}\n\tif (sendUpdate)\n\t{\n\t\tItemManager.DoRemoves();\n\t\tSendNetworkUpdateImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnRackedWeaponTaken\", slot, player, this);\n}\n",
      "ParametersText": "WeaponRack rack, BasePlayer player, Item item, int mountSlotIndex, int playerBeltIndex, bool tryHold",
      "TargetName": "WeaponRack",
      "MethodName": "GivePlayerWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3306666476,
      "Name": "OnChairComfort",
      "FullName": "OnChairComfort",
      "Category": "Global",
      "Parameters": [
        {
          "name": "chair",
          "typeName": "BaseChair",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when chair comfort occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public override float GetComfort()\n{\n\treturn 1f;\n}\n",
      "ParametersText": "BaseChair chair",
      "TargetName": "BaseChair",
      "MethodName": "GetComfort",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "float"
    },
    {
      "Id": 4136550545,
      "Name": "OnEntitySpawn",
      "FullName": "OnEntitySpawn",
      "Category": "Global",
      "Parameters": [
        {
          "name": "networkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public virtual void Spawn()\n{\n\tFacepunch.Rust.Profiling.EntityProfiler.spawned++;\n\tif (Facepunch.Rust.Profiling.EntityProfiler.mode >= 2)\n\t{\n\t\tFacepunch.Rust.Profiling.EntityProfiler.OnSpawned(this);\n\t}\n\tSpawnShared();\n\tif (net == null)\n\t{\n\t\tnet = Network.Net.sv.CreateNetworkable();\n\t}\n\tcreationFrame = UnityEngine.Time.frameCount;\n\tPreInitShared();\n\tInitShared();\n\tServerInit();\n\tPostInitShared();\n\tUpdateNetworkGroup();\n\tServerInitPostNetworkGroupAssign();\n\tisSpawned = true;\n\tOxide.Core.Interface.CallHook(\"OnEntitySpawned\", this);\n\tSendNetworkUpdateImmediate();\n\tInvoke(SendGlobalNetworkUpdate, 0f);\n\tif (Rust.Application.isLoading && !Rust.Application.isLoadingSave)\n\t{\n\t\tbase.gameObject.SendOnSendNetworkUpdate(this as BaseEntity);\n\t}\n}\n",
      "ParametersText": "BaseNetworkable networkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "Spawn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1990146717,
      "Name": "OnChickenScared",
      "FullName": "OnChickenScared",
      "Category": "Global",
      "Parameters": [
        {
          "name": "chicken",
          "typeName": "Chicken",
          "optional": false
        },
        {
          "name": "threat",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a chicken is scared."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "",
      "ParametersText": "Chicken chicken, BaseEntity threat",
      "TargetName": "AnimalBrain+FleeState",
      "MethodName": "StateEnter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2306141762,
      "Name": "CanAcceptBackpackItem",
      "FullName": "CanAcceptBackpackItem",
      "Category": "Global",
      "Parameters": [
        {
          "name": "backpack",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to accept backpack item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public bool CanAcceptItem(Item backpack, Item item, int slot)\n{\n\tif (backpack.parent == null)\n\t{\n\t\treturn true;\n\t}\n\tif (backpack.parent.HasFlag(ItemContainer.Flag.Clothing))\n\t{\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "Item backpack, Item item",
      "TargetName": "ItemModBackpack",
      "MethodName": "CanAcceptItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3530583763,
      "Name": "OnJackieChan",
      "FullName": "OnJackieChan",
      "Category": "Global",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public void PlayerInit(Network.Connection c)\n{\n\tusing (TimeWarning.New(\"PlayerInit\", 10))\n\t{\n\t\tCancelInvoke(base.KillMessage);\n\t\tCancelInvoke(OfflineMetabolism);\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Connected, b: true);\n\t\tactivePlayerList.Add(this);\n\t\tactivePlayerLookup[c.userid] = this;\n\t\tAddToPlayerCache(this);\n\t\tbots.Remove(this);\n\t\tbotColliderWorkQueue.Remove(this);\n\t\tuserID = c.userid;\n\t\tUserIDString = userID.Get().ToString();\n\t\tdisplayName = c.username;\n\t\tc.player = this;\n\t\tsecondsConnected = 0;\n\t\tcurrentTeam = RelationshipManager.ServerInstance.FindPlayersTeam(userID)?.teamID ?? 0;\n\t\tSingletonComponent<ServerMgr>.Instance.persistance.SetPlayerName(userID, displayName);\n\t\tUnityEngine.Vector3 position = base.transform.position;\n\t\tTickCache.Reset(this, position);\n\t\ttickHistory.Reset(position);\n\t\teyeHistory.Clear();\n\t\tlastTickTime = 0f;\n\t\tlastInputTime = 0f;\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, b: true);\n\t\tlastSentActiveWorkbenchId = default(NetworkableId);\n\t\tstats.Init();\n\t\tInvokeRandomized(StatSave, UnityEngine.Random.Range(5f, 10f), 30f, UnityEngine.Random.Range(0f, 6f));\n\t\tpreviousLifeStory = SingletonComponent<ServerMgr>.Instance.persistance.GetLastLifeStory(userID);\n\t\tif (previousLifeStory != null && previousLifeStory.wipeId != SaveRestore.WipeId)\n\t\t{\n\t\t\tpreviousLifeStory = null;\n\t\t}\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.IsAdmin, c.authLevel != 0);\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.IsDeveloper, DeveloperList.IsDeveloper(this));\n\t\tif (ServerOcclusion.OcclusionEnabled && SupportsServerOcclusion())\n\t\t{\n\t\t\tOcclusionInitGroup(canBeInAGroup: false);\n\t\t}\n\t\tif (IsDead() && net.SwitchGroup(BaseNetworkable.LimboNetworkGroup))\n\t\t{\n\t\t\tSendNetworkGroupChange();\n\t\t}\n\t\tnet.OnConnected(c);\n\t\tnet.StartSubscriber();\n\t\tSendAsSnapshot(net.connection);\n\t\tGlobalNetworkHandler.server.StartSendingSnapshot(this);\n\t\tClientRPC(RpcTarget.Player(\"StartLoading\", this));\n\t\tif ((bool)BaseGameMode.GetActiveGameMode(serverside: true))\n\t\t{\n\t\t\tBaseGameMode.GetActiveGameMode(serverside: true).OnPlayerConnected(this);\n\t\t}\n\t\tif (net != null)\n\t\t{\n\t\t\tEACServer.OnStartLoading(net.connection);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"IOnPlayerConnected\", this);\n\t\tif (IsAdmin)\n\t\t{\n\t\t\tif (ConVar.AntiHack.noclip_protection <= 0)\n\t\t\t{\n\t\t\t\tChatMessage(\"antihack.noclip_protection is disabled!\");\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.speedhack_protection <= 0)\n\t\t\t{\n\t\t\t\tChatMessage(\"antihack.speedhack_protection is disabled!\");\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.flyhack_protection <= 0)\n\t\t\t{\n\t\t\t\tChatMessage(\"antihack.flyhack_protection is disabled!\");\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.projectile_protection <= 0)\n\t\t\t{\n\t\t\t\tChatMessage(\"antihack.projectile_protection is disabled!\");\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.melee_protection <= 0)\n\t\t\t{\n\t\t\t\tChatMessage(\"antihack.melee_protection is disabled!\");\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.eye_protection <= 0)\n\t\t\t{\n\t\t\t\tChatMessage(\"antihack.eye_protection is disabled!\");\n\t\t\t}\n\t\t\tCommand(\"debug.setinvis_ui\", isInvisible);\n\t\t\tif (isInvisible)\n\t\t\t{\n\t\t\t\tinvisPlayers.Add(this);\n\t\t\t}\n\t\t}\n\t\tinventory.crafting.SendToOwner();\n\t\tif (TerrainMeta.Path != null && TerrainMeta.Path.OceanPatrolFar != null)\n\t\t{\n\t\t\tSendCargoPatrolPath();\n\t\t}\n\t\tif (currentTeam == 0L && RelationshipManager.ServerInstance.HasPendingInvite(userID, out var foundTeamID) && RelationshipManager.ServerInstance.GetTeamLeaderInfo(foundTeamID, out var leaderDisplayName, out var leaderID))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"CLIENT_PendingInvite\", this), leaderDisplayName, leaderID, foundTeamID);\n\t\t}\n\t\trequestingReputationUpdate = true;\n\t}\n}\n",
      "ParametersText": "BasePlayer player",
      "TargetName": "BasePlayer",
      "MethodName": "PlayerInit",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 617273774,
      "Name": "CanPlayerInheritNetworkGroup",
      "FullName": "CanPlayerInheritNetworkGroup",
      "Category": "Global",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to player inherit network group.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public override bool ShouldInheritNetworkGroup()\n{\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player",
      "TargetName": "BasePlayer",
      "MethodName": "ShouldInheritNetworkGroup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 719742115,
      "Name": "OnGrowableUpdate",
      "FullName": "OnGrowableUpdate",
      "Category": "Global",
      "Parameters": [
        {
          "name": "growable",
          "typeName": "GrowableEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a growable is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public void RunUpdate()\n{\n\tif (!IsDead())\n\t{\n\t\tCalculateQualities(firstTime: false);\n\t\tfloat overallQuality = CalculateOverallQuality();\n\t\tfloat actualStageAgeIncrease = UpdateAge(overallQuality);\n\t\tUpdateHealthAndYield(overallQuality, actualStageAgeIncrease);\n\t\tif (base.health <= 0f)\n\t\t{\n\t\t\tTellPlanter();\n\t\t\tDie();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUpdateState();\n\t\t\tConsumeWater();\n\t\t\tSendNetworkUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "GrowableEntity growable",
      "TargetName": "GrowableEntity",
      "MethodName": "RunUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Plugin": [
    {
      "Id": 2006954389,
      "Name": "Init",
      "FullName": "Init [Instance]",
      "Category": "Plugin",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called when the plugin is constructed and initialized.",
        "Initialize your state, config, and command registrations here."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static Oxide.Plugins.RustPlugin InitializePlugin(System.Reflection.Assembly assembly, Carbon.Core.ModLoader.Package package = default(Carbon.Core.ModLoader.Package), System.Action<Oxide.Plugins.RustPlugin> preInit = null, bool precompiled = false)\n{\n\tSystem.Type[] types = assembly.GetTypes();\n\tforeach (System.Type type in types)\n\t{\n\t\tif (!(type.BaseType == null) && IsValidPlugin(type.BaseType, recursive: false) && InitializePlugin(type, out var plugin, package, preInit, precompiled))\n\t\t{\n\t\t\treturn plugin;\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "InitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 313256762,
      "Name": "LoadDefaultMessages",
      "FullName": "LoadDefaultMessages [Instance]",
      "Category": "Plugin",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called to register the plugin's default localization/messages.",
        "Register default localization strings for all languages."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static Oxide.Plugins.RustPlugin InitializePlugin(System.Reflection.Assembly assembly, Carbon.Core.ModLoader.Package package = default(Carbon.Core.ModLoader.Package), System.Action<Oxide.Plugins.RustPlugin> preInit = null, bool precompiled = false)\n{\n\tSystem.Type[] types = assembly.GetTypes();\n\tforeach (System.Type type in types)\n\t{\n\t\tif (!(type.BaseType == null) && IsValidPlugin(type.BaseType, recursive: false) && InitializePlugin(type, out var plugin, package, preInit, precompiled))\n\t\t{\n\t\t\treturn plugin;\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "InitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2278850931,
      "Name": "Loaded",
      "FullName": "Loaded [Instance]",
      "Category": "Plugin",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called after the plugin has been loaded and its dependencies are ready.",
        "All dependencies are available at this point; perform post???load setup."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static Oxide.Plugins.RustPlugin InitializePlugin(System.Reflection.Assembly assembly, Carbon.Core.ModLoader.Package package = default(Carbon.Core.ModLoader.Package), System.Action<Oxide.Plugins.RustPlugin> preInit = null, bool precompiled = false)\n{\n\tSystem.Type[] types = assembly.GetTypes();\n\tforeach (System.Type type in types)\n\t{\n\t\tif (!(type.BaseType == null) && IsValidPlugin(type.BaseType, recursive: false) && InitializePlugin(type, out var plugin, package, preInit, precompiled))\n\t\t{\n\t\t\treturn plugin;\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "InitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1281679197,
      "Name": "OnLoaded",
      "FullName": "OnLoaded [Instance]",
      "Category": "Plugin",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called after the plugin finishes loading; use this to run post???load setup.",
        "Great place to start timers or cache references after load."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static Oxide.Plugins.RustPlugin InitializePlugin(System.Reflection.Assembly assembly, Carbon.Core.ModLoader.Package package = default(Carbon.Core.ModLoader.Package), System.Action<Oxide.Plugins.RustPlugin> preInit = null, bool precompiled = false)\n{\n\tSystem.Type[] types = assembly.GetTypes();\n\tforeach (System.Type type in types)\n\t{\n\t\tif (!(type.BaseType == null) && IsValidPlugin(type.BaseType, recursive: false) && InitializePlugin(type, out var plugin, package, preInit, precompiled))\n\t\t{\n\t\t\treturn plugin;\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "InitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1298319061,
      "Name": "OnPluginCompileFailure",
      "FullName": "OnPluginCompileFailure",
      "Category": "Plugin",
      "Parameters": [
        {
          "name": "pluginName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "error",
          "typeName": "System.Exception",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a plugin fails to compile."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": null,
      "ParametersText": "string pluginName, System.Exception error",
      "TargetName": "Carbon.Managers.ScriptLoader",
      "MethodName": "Compile",
      "AssemblyName": "Carbon",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2056163335,
      "Name": "OnPluginOutdated",
      "FullName": "OnPluginOutdated",
      "Category": "Plugin",
      "Parameters": [
        {
          "name": "pluginName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "currentVersion",
          "typeName": "Oxide.Core.VersionNumber",
          "optional": false
        },
        {
          "name": "newVersion",
          "typeName": "Oxide.Core.VersionNumber",
          "optional": false
        },
        {
          "name": "plugin",
          "typeName": "Oxide.Core.Plugins.Plugin",
          "optional": false
        },
        {
          "name": "vendorName",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a plugin is outdated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "",
      "ParametersText": "string pluginName, Oxide.Core.VersionNumber currentVersion, Oxide.Core.VersionNumber newVersion, Oxide.Core.Plugins.Plugin plugin, string vendorName",
      "TargetName": "Carbon.Modules.AdminModule+PluginsTab+Vendor",
      "MethodName": "VersionCheck",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4006810030,
      "Name": "Unload",
      "FullName": "Unload [Instance]",
      "Category": "Plugin",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called when the plugin is being unloaded; clean up resources and state here.",
        "Dispose timers, subscriptions, and revert patches before exit."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static Oxide.Plugins.RustPlugin InitializePlugin(System.Reflection.Assembly assembly, Carbon.Core.ModLoader.Package package = default(Carbon.Core.ModLoader.Package), System.Action<Oxide.Plugins.RustPlugin> preInit = null, bool precompiled = false)\n{\n\tSystem.Type[] types = assembly.GetTypes();\n\tforeach (System.Type type in types)\n\t{\n\t\tif (!(type.BaseType == null) && IsValidPlugin(type.BaseType, recursive: false) && InitializePlugin(type, out var plugin, package, preInit, precompiled))\n\t\t{\n\t\t\treturn plugin;\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "InitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    }
  ],
  "CUI": [
    {
      "Id": 1307002116,
      "Name": "CanUseUI",
      "FullName": "CanUseUI",
      "Category": "CUI",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "json",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called to determine whether to use ui.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool AddUi(BasePlayer player, string json)\n{\n\tif (player == null || player.net == null)\n\t{\n\t\treturn false;\n\t}\n\tif (Carbon.HookCaller.CallStaticHook(1307002116u, player, json) != null)\n\t{\n\t\treturn false;\n\t}\n\tCommunityEntity.ServerInstance.ClientRPC(RpcTarget.Player(\"AddUI\", player), json);\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, string json",
      "TargetName": "Oxide.Game.Rust.Cui.CuiHelper",
      "MethodName": "AddUi",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 503981600,
      "Name": "OnDestroyUI",
      "FullName": "OnDestroyUI",
      "Category": "CUI",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "name",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when destroy UI occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool DestroyUi(BasePlayer player, string name)\n{\n\tif (player?.net != null)\n\t{\n\t\tSystem.Collections.Generic.HashSet<string> activePanelList = GetActivePanelList(player);\n\t\tif (activePanelList.Contains(name))\n\t\t{\n\t\t\tactivePanelList.Remove(name);\n\t\t}\n\t\tCarbon.HookCaller.CallStaticHook(503981600u, player, name);\n\t\tCommunityEntity.ServerInstance.ClientRPC(RpcTarget.Player(\"DestroyUI\", player), name);\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, string name",
      "TargetName": "Oxide.Game.Rust.Cui.CuiHelper",
      "MethodName": "DestroyUi",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    }
  ],
  "Engine": [
    {
      "Id": 3335797162,
      "Name": "LoadDefaultConfig",
      "FullName": "LoadDefaultConfig",
      "Category": "Engine",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called to create a default config when none exists.",
        "Populate default config keys/values when no file exists."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected virtual void LoadConfig()\n{\n\tConfig = new Oxide.Core.Configuration.DynamicConfigFile(System.IO.Path.Combine(Manager.ConfigPath, base.Name + \".json\"));\n\tif (!Config.Exists())\n\t{\n\t\tCallHook(\"LoadDefaultConfig\");\n\t\tSaveConfig();\n\t}\n\ttry\n\t{\n\t\tif (Config.Exists())\n\t\t{\n\t\t\tConfig.Load();\n\t\t}\n\t}\n\tcatch (System.Exception ex)\n\t{\n\t\tCarbon.Logger.Error(\"Failed to load config file (is the config file corrupt?)\", ex);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Oxide.Core.Plugins.Plugin",
      "MethodName": "LoadConfig",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2719094727,
      "Name": "OnCompilationFail",
      "FullName": "OnCompilationFail",
      "Category": "Engine",
      "Parameters": [
        {
          "name": "file",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "result",
          "typeName": "Carbon.Core.ModLoader+CompilationResult",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a plugin compilation attempt fails."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": null,
      "ParametersText": "string file, Carbon.Core.ModLoader.CompilationResult result",
      "TargetName": "Carbon.Managers.ScriptLoader",
      "MethodName": "Compile",
      "AssemblyName": "Carbon",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2684549964,
      "Name": "OnConstructorFail",
      "FullName": "OnConstructorFail",
      "Category": "Engine",
      "Parameters": [
        {
          "name": "plugin",
          "typeName": "Oxide.Plugins.RustPlugin",
          "optional": false
        },
        {
          "name": "exception",
          "typeName": "System.Exception",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a plugin's constructor throws during initialization."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static Oxide.Plugins.RustPlugin InitializePlugin(System.Reflection.Assembly assembly, Carbon.Core.ModLoader.Package package = default(Carbon.Core.ModLoader.Package), System.Action<Oxide.Plugins.RustPlugin> preInit = null, bool precompiled = false)\n{\n\tSystem.Type[] types = assembly.GetTypes();\n\tforeach (System.Type type in types)\n\t{\n\t\tif (!(type.BaseType == null) && IsValidPlugin(type.BaseType, recursive: false) && InitializePlugin(type, out var plugin, package, preInit, precompiled))\n\t\t{\n\t\t\treturn plugin;\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "Oxide.Plugins.RustPlugin plugin, System.Exception exception",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "InitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3051933177,
      "Name": "OnPluginLoaded",
      "FullName": "OnPluginLoaded",
      "Category": "Engine",
      "Parameters": [
        {
          "name": "plugin",
          "typeName": "Oxide.Plugins.RustPlugin",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called after a plugin is loaded into memory."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": null,
      "ParametersText": "Oxide.Plugins.RustPlugin plugin",
      "TargetName": "Carbon.Managers.ScriptLoader",
      "MethodName": "Compile",
      "AssemblyName": "Carbon",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1250294368,
      "Name": "OnPluginUnloaded",
      "FullName": "OnPluginUnloaded",
      "Category": "Engine",
      "Parameters": [
        {
          "name": "plugin",
          "typeName": "Oxide.Plugins.RustPlugin",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called after a plugin has been unloaded and disposed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool UninitializePlugin(Oxide.Plugins.RustPlugin plugin, bool premature = false, bool unloadDependantPlugins = true)\n{\n\tif (!premature && !plugin.IsLoaded)\n\t{\n\t\treturn true;\n\t}\n\tplugin.UnapplyOrderedPatches(Oxide.Core.Plugins.AutoPatchAttribute.Orders.Delayed);\n\tplugin.UnapplyOrderedPatches(Oxide.Core.Plugins.AutoPatchAttribute.Orders.AfterOnServerInitialized);\n\tplugin.UnapplyOrderedPatches(Oxide.Core.Plugins.AutoPatchAttribute.Orders.AfterPluginLoad);\n\tplugin.UnapplyOrderedPatches(Oxide.Core.Plugins.AutoPatchAttribute.Orders.AfterPluginInit);\n\tif (unloadDependantPlugins)\n\t{\n\t\tplugin.IUnloadDependantPlugins();\n\t}\n\tif (!premature)\n\t{\n\t\tplugin.CallHook(\"Unload\");\n\t}\n\tAPI.Events.CarbonEventArgs obj = Facepunch.Pool.Get<API.Events.CarbonEventArgs>();\n\tobj.Init(plugin);\n\tCarbon.Community.Runtime.Events.Trigger(API.Events.CarbonEvent.PluginUnloaded, obj);\n\tFacepunch.Pool.Free(ref obj);\n\tRemoveCommands(plugin);\n\tplugin.IUnload();\n\tif (!premature)\n\t{\n\t\tCarbon.HookCaller.CallStaticHook(1250294368u, plugin);\n\t}\n\tplugin.Dispose();\n\tif (!premature)\n\t{\n\t\tCarbon.Logger.Log(\"Unloaded plugin \" + plugin.ToPrettyString());\n\t\tOxide.Core.Interface.Oxide.RootPluginManager.RemovePlugin(plugin);\n\t\tOxide.Core.Plugins.Plugin.InternalApplyAllPluginReferences();\n\t}\n\treturn true;\n}\n",
      "ParametersText": "Oxide.Plugins.RustPlugin plugin",
      "TargetName": "Carbon.Core.ModLoader",
      "MethodName": "UninitializePlugin",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    }
  ],
  "Permissions": [
    {
      "Id": 1889097028,
      "Name": "OnGroupCreated",
      "FullName": "OnGroupCreated",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "title",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "rank",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a permission group is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CreateGroup(string group, string title, int rank)\n{\n\tif (string.IsNullOrEmpty(group) || GroupExists(group))\n\t{\n\t\treturn false;\n\t}\n\tOxide.Core.Libraries.GroupData value = new Oxide.Core.Libraries.GroupData\n\t{\n\t\tTitle = title,\n\t\tRank = rank\n\t};\n\tif (!UnityEngine.StringEx.IsLower(group))\n\t{\n\t\tgroup = group.ToLower();\n\t}\n\tgroupdata.Add(group, value);\n\tCarbon.HookCaller.CallStaticHook(1889097028u, group, title, rank);\n\treturn true;\n}\n",
      "ParametersText": "string group, string title, int rank",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "CreateGroup",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3702696305,
      "Name": "OnGroupDeleted",
      "FullName": "OnGroupDeleted",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a permission group is deleted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool RemoveGroup(string group)\n{\n\tif (!GroupExists(group))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(group))\n\t{\n\t\tgroup = group.ToLower();\n\t}\n\tbool flag = groupdata.Remove(group);\n\tif (flag)\n\t{\n\t\tforeach (Oxide.Core.Libraries.GroupData item in System.Linq.Enumerable.Where(groupdata.Values, (Oxide.Core.Libraries.GroupData groupData) => groupData.ParentGroup == group))\n\t\t{\n\t\t\titem.ParentGroup = string.Empty;\n\t\t}\n\t}\n\tif (System.Linq.Enumerable.Aggregate(userdata.Values, seed: false, (bool current, Oxide.Core.Libraries.UserData userData) => current | userData.Groups.Remove(group)))\n\t{\n\t\tSaveUsers();\n\t}\n\tif (flag)\n\t{\n\t\tCarbon.HookCaller.CallStaticHook(3702696305u, group);\n\t}\n\treturn true;\n}\n",
      "ParametersText": "string group",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "RemoveGroup",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3763369361,
      "Name": "OnGroupParentSet",
      "FullName": "OnGroupParentSet",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "parentGroup",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a group's parent is set or changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool SetGroupParent(string group, string parent)\n{\n\tif (!GroupExists(group))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(group))\n\t{\n\t\tgroup = group.ToLower();\n\t}\n\tif (!groupdata.TryGetValue(group, out var value))\n\t{\n\t\treturn false;\n\t}\n\tif (string.IsNullOrEmpty(parent))\n\t{\n\t\tvalue.ParentGroup = null;\n\t\treturn true;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(parent))\n\t{\n\t\tparent = parent.ToLower();\n\t}\n\tif (!GroupExists(parent) || group.Equals(parent))\n\t{\n\t\treturn false;\n\t}\n\tif (!string.IsNullOrEmpty(value.ParentGroup) && value.ParentGroup.Equals(parent))\n\t{\n\t\treturn true;\n\t}\n\tif (HasCircularParent(group, parent))\n\t{\n\t\treturn false;\n\t}\n\tvalue.ParentGroup = parent;\n\tCarbon.HookCaller.CallStaticHook(3763369361u, group, parent);\n\treturn true;\n}\n",
      "ParametersText": "string group, string parentGroup",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "SetGroupParent",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2479711677,
      "Name": "OnGroupPermissionGranted",
      "FullName": "OnGroupPermissionGranted",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "permission",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a permission is granted to a group."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool GrantGroupPermission(string name, string perm, Carbon.Base.BaseHookable owner)\n{\n\tif (!PermissionExists(perm, owner) || !GroupExists(name))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(name))\n\t{\n\t\tname = name.ToLower();\n\t}\n\tif (!groupdata.TryGetValue(name, out var data))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(perm))\n\t{\n\t\tperm = perm.ToLower();\n\t}\n\tif (perm.EndsWith(StarStr))\n\t{\n\t\tSystem.Collections.Generic.HashSet<string> value;\n\t\tif (owner == null)\n\t\t{\n\t\t\tvalue = new System.Collections.Generic.HashSet<string>(System.Linq.Enumerable.SelectMany(permset.Values, (System.Collections.Generic.HashSet<string> v) => v));\n\t\t}\n\t\telse if (!permset.TryGetValue(owner, out value))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (perm.Equals(StarStr))\n\t\t{\n\t\t\treturn System.Linq.Enumerable.Aggregate(value, seed: false, delegate(bool c, string s)\n\t\t\t{\n\t\t\t\tif (!(c | data.Perms.Add(s)))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tCarbon.HookCaller.CallStaticHook(2479711677u, name, perm);\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\tperm = perm.TrimEnd(Star).ToLower();\n\t\treturn System.Linq.Enumerable.Aggregate(System.Linq.Enumerable.Where(value, (string s) => s.StartsWith(perm)), seed: false, delegate(bool c, string s)\n\t\t{\n\t\t\tif (!(c | data.Perms.Add(s)))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tCarbon.HookCaller.CallStaticHook(2479711677u, name, perm);\n\t\t\treturn true;\n\t\t});\n\t}\n\tif (!data.Perms.Add(perm))\n\t{\n\t\treturn false;\n\t}\n\tCarbon.HookCaller.CallStaticHook(2479711677u, name, perm);\n\treturn true;\n}\n",
      "ParametersText": "string group, string permission",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "GrantGroupPermission",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3443835039,
      "Name": "OnGroupPermissionRevoked",
      "FullName": "OnGroupPermissionRevoked",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "permission",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a permission is revoked from a group."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool RevokeGroupPermission(string name, string perm)\n{\n\tif (!GroupExists(name) || string.IsNullOrEmpty(perm))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(name))\n\t{\n\t\tname = name.ToLower();\n\t}\n\tif (!groupdata.TryGetValue(name, out var value))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(perm))\n\t{\n\t\tperm = perm.ToLower();\n\t}\n\tif (perm.EndsWith(StarStr))\n\t{\n\t\tif (!perm.Equals(StarStr))\n\t\t{\n\t\t\tperm = perm.TrimEnd(Star).ToLower();\n\t\t\treturn value.Perms.RemoveWhere(delegate(string s)\n\t\t\t{\n\t\t\t\tif (!s.StartsWith(perm))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tCarbon.HookCaller.CallStaticHook(3443835039u, name, s);\n\t\t\t\treturn true;\n\t\t\t}) > 0;\n\t\t}\n\t\tif (value.Perms.Count <= 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tforeach (string perm2 in value.Perms)\n\t\t{\n\t\t\tCarbon.HookCaller.CallStaticHook(3443835039u, name, perm2);\n\t\t}\n\t\tvalue.Perms.Clear();\n\t\treturn true;\n\t}\n\tif (!value.Perms.Remove(perm))\n\t{\n\t\treturn false;\n\t}\n\tCarbon.HookCaller.CallStaticHook(3443835039u, name, perm);\n\treturn true;\n}\n",
      "ParametersText": "string group, string permission",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "RevokeGroupPermission",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 407332709,
      "Name": "OnGroupRankSet",
      "FullName": "OnGroupRankSet",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "rank",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a group's rank value is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool SetGroupRank(string group, int rank)\n{\n\tif (!GroupExists(group))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(group))\n\t{\n\t\tgroup = group.ToLower();\n\t}\n\tif (!groupdata.TryGetValue(group, out var value))\n\t{\n\t\treturn false;\n\t}\n\tif (value.Rank == rank)\n\t{\n\t\treturn true;\n\t}\n\tvalue.Rank = rank;\n\tCarbon.HookCaller.CallStaticHook(407332709u, group, rank);\n\treturn true;\n}\n",
      "ParametersText": "string group, int rank",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "SetGroupRank",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1035562059,
      "Name": "OnGroupTitleSet",
      "FullName": "OnGroupTitleSet",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "title",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a group's title is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool SetGroupTitle(string group, string title)\n{\n\tif (!GroupExists(group))\n\t{\n\t\treturn false;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(group))\n\t{\n\t\tgroup = group.ToLower();\n\t}\n\tif (!groupdata.TryGetValue(group, out var value))\n\t{\n\t\treturn false;\n\t}\n\tif (value.Title == title)\n\t{\n\t\treturn true;\n\t}\n\tvalue.Title = title;\n\tCarbon.HookCaller.CallStaticHook(1035562059u, group, title);\n\treturn true;\n}\n",
      "ParametersText": "string group, string title",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "SetGroupTitle",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4257240972,
      "Name": "OnPermissionRegistered",
      "FullName": "OnPermissionRegistered",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "permission",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "plugin",
          "typeName": "Oxide.Core.Plugins.Plugin",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a plugin registers a new permission string."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void RegisterPermission(string name, Carbon.Base.BaseHookable owner)\n{\n\tif (string.IsNullOrEmpty(name))\n\t{\n\t\treturn;\n\t}\n\tif (!UnityEngine.StringEx.IsLower(name))\n\t{\n\t\tname = name.ToLower();\n\t}\n\tif (PermissionExists(name, owner))\n\t{\n\t\treturn;\n\t}\n\tif (PermissionExists(name))\n\t{\n\t\tCarbon.Logger.Warn(\"Trying to register permission '\" + name + \"' but already used by another plugin. (Requestee plugin '\" + owner.Name + \"')\");\n\t}\n\telse\n\t{\n\t\tif (!permset.TryGetValue(owner, out var value))\n\t\t{\n\t\t\tvalue = new System.Collections.Generic.HashSet<string>();\n\t\t\tpermset.Add(owner, value);\n\t\t}\n\t\tvalue.Add(name);\n\t\tCarbon.HookCaller.CallStaticHook(4257240972u, name, owner);\n\t}\n}\n",
      "ParametersText": "string permission, Oxide.Core.Plugins.Plugin plugin",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "RegisterPermission",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2952085131,
      "Name": "OnPermissionsUnregistered",
      "FullName": "OnPermissionsUnregistered",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "plugin",
          "typeName": "Oxide.Core.Plugins.Plugin",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a plugin unregisters all of its permissions."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void UnregisterPermissions(Carbon.Base.BaseHookable owner)\n{\n\tif (owner != null && permset.TryGetValue(owner, out var value))\n\t{\n\t\tvalue.Clear();\n\t\tpermset.Remove(owner);\n\t\tCarbon.HookCaller.CallStaticHook(2952085131u, owner);\n\t}\n}\n",
      "ParametersText": "Oxide.Core.Plugins.Plugin plugin",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "UnregisterPermissions",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3116013984,
      "Name": "OnUserGroupAdded",
      "FullName": "OnUserGroupAdded",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "playerId",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a user is added to a permission group."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void AddUserGroup(string id, string name, bool addIfNotExisting = false)\n{\n\tif (GroupExists(name) && GetUserData(id, addIfNotExisting).Groups.Add(name.ToLower()))\n\t{\n\t\tCarbon.HookCaller.CallStaticHook(3116013984u, id, name);\n\t}\n}\n",
      "ParametersText": "string playerId, string group",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "AddUserGroup",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1018697706,
      "Name": "OnUserGroupRemoved",
      "FullName": "OnUserGroupRemoved",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "playerId",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "group",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a user is removed from a permission group."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void RemoveUserGroup(string id, string name)\n{\n\tif (!UnityEngine.StringEx.IsLower(name))\n\t{\n\t\tname = name.ToLower();\n\t}\n\tif (!GroupExists(name))\n\t{\n\t\treturn;\n\t}\n\tOxide.Core.Libraries.UserData userData = GetUserData(id);\n\tif (name.Equals(StarStr))\n\t{\n\t\tif (userData.Groups.Count <= 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (string group in userData.Groups)\n\t\t{\n\t\t\tCarbon.HookCaller.CallStaticHook(1018697706u, id, group);\n\t\t}\n\t\tuserData.Groups.Clear();\n\t}\n\telse if (userData.Groups.Remove(name))\n\t{\n\t\tCarbon.HookCaller.CallStaticHook(1018697706u, id, name);\n\t}\n}\n",
      "ParametersText": "string playerId, string group",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "RemoveUserGroup",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4255507790,
      "Name": "OnUserNameUpdated",
      "FullName": "OnUserNameUpdated",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "id",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "oldName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "newName",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a user's last???seen nickname is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void UpdateNickname(string id, string nickname)\n{\n\tif (UserExists(id))\n\t{\n\t\tOxide.Core.Libraries.UserData userData = GetUserData(id);\n\t\tstring lastSeenNickname = userData.LastSeenNickname;\n\t\tuserData.LastSeenNickname = nickname.Sanitize();\n\t\tCommitUser(id, userData);\n\t\tCarbon.HookCaller.CallStaticHook(4255507790u, id, lastSeenNickname, userData.LastSeenNickname);\n\t}\n}\n",
      "ParametersText": "string id, string oldName, string newName",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "UpdateNickname",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4054877424,
      "Name": "OnUserPermissionGranted",
      "FullName": "OnUserPermissionGranted",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "playerId",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "permission",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a permission is granted to a user."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool GrantUserPermission(string id, string perm, Carbon.Base.BaseHookable owner)\n{\n\tif (!PermissionExists(perm, owner))\n\t{\n\t\treturn false;\n\t}\n\tOxide.Core.Libraries.UserData data = GetUserData(id);\n\tif (!UnityEngine.StringEx.IsLower(perm))\n\t{\n\t\tperm = perm.ToLower();\n\t}\n\tif (perm.EndsWith(StarStr))\n\t{\n\t\tSystem.Collections.Generic.HashSet<string> value;\n\t\tif (owner == null)\n\t\t{\n\t\t\tvalue = new System.Collections.Generic.HashSet<string>(System.Linq.Enumerable.SelectMany(permset.Values, (System.Collections.Generic.HashSet<string> v) => v));\n\t\t}\n\t\telse if (!permset.TryGetValue(owner, out value))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (perm.Equals(StarStr))\n\t\t{\n\t\t\treturn System.Linq.Enumerable.Aggregate(value, seed: false, delegate(bool c, string s)\n\t\t\t{\n\t\t\t\tif (!(c | data.Perms.Add(s)))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tCarbon.HookCaller.CallStaticHook(4054877424u, id, s);\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\tperm = perm.TrimEnd(Star);\n\t\treturn System.Linq.Enumerable.Aggregate(System.Linq.Enumerable.Where(value, (string s) => s.StartsWith(perm)), seed: false, delegate(bool c, string s)\n\t\t{\n\t\t\tif (!(c | data.Perms.Add(s)))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tCarbon.HookCaller.CallStaticHook(4054877424u, id, s);\n\t\t\treturn true;\n\t\t});\n\t}\n\tif (!data.Perms.Add(perm))\n\t{\n\t\treturn false;\n\t}\n\tCarbon.HookCaller.CallStaticHook(4054877424u, id, perm);\n\treturn true;\n}\n",
      "ParametersText": "string playerId, string permission",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "GrantUserPermission",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1879829838,
      "Name": "OnUserPermissionRevoked",
      "FullName": "OnUserPermissionRevoked",
      "Category": "Permissions",
      "Parameters": [
        {
          "name": "playerId",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "permission",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a permission is revoked from a user."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool RevokeUserPermission(string id, string perm)\n{\n\tif (string.IsNullOrEmpty(perm))\n\t{\n\t\treturn false;\n\t}\n\tOxide.Core.Libraries.UserData userData = GetUserData(id);\n\tif (!UnityEngine.StringEx.IsLower(perm))\n\t{\n\t\tperm = perm.ToLower();\n\t}\n\tif (perm.EndsWith(StarStr))\n\t{\n\t\tif (!perm.Equals(StarStr))\n\t\t{\n\t\t\tperm = perm.TrimEnd(Star);\n\t\t\treturn userData.Perms.RemoveWhere(delegate(string s)\n\t\t\t{\n\t\t\t\tif (!s.StartsWith(perm))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tCarbon.HookCaller.CallStaticHook(1879829838u, id, s);\n\t\t\t\treturn true;\n\t\t\t}) > 0;\n\t\t}\n\t\tif (userData.Perms.Count <= 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tuserData.Perms.Clear();\n\t\treturn true;\n\t}\n\tif (!userData.Perms.Remove(perm))\n\t{\n\t\treturn false;\n\t}\n\tCarbon.HookCaller.CallStaticHook(1879829838u, id, perm);\n\treturn true;\n}\n",
      "ParametersText": "string playerId, string permission",
      "TargetName": "Oxide.Core.Libraries.Permission",
      "MethodName": "RevokeUserPermission",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    }
  ],
  "Entity": [
    {
      "Id": 952055589,
      "Name": "OnEntityTakeDamage",
      "FullName": "OnEntityTakeDamage",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "entity",
          "typeName": "BaseCombatEntity",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an entity take is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnBasePlayerAttacked(BasePlayer basePlayer, HitInfo hitInfo)\n{\n\tif (!Carbon.Community.IsServerInitialized || _isPlayerTakingDamage || basePlayer == null || hitInfo == null || basePlayer.IsDead() || basePlayer is NPCPlayer)\n\t{\n\t\treturn null;\n\t}\n\tif (Carbon.HookCaller.CallStaticHook(952055589u, basePlayer, hitInfo) != null)\n\t{\n\t\treturn Carbon.Cache.True;\n\t}\n\t_isPlayerTakingDamage = true;\n\ttry\n\t{\n\t\tbasePlayer.OnAttacked(hitInfo);\n\t}\n\tfinally\n\t{\n\t\t_isPlayerTakingDamage = false;\n\t}\n\treturn Carbon.Cache.True;\n}\n",
      "ParametersText": "BaseCombatEntity entity, HitInfo info",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnBasePlayerAttacked",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2949838417,
      "Name": "OnEntitySpawned",
      "FullName": "OnEntitySpawned",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Spawn()\n{\n\tFacepunch.Rust.Profiling.EntityProfiler.spawned++;\n\tif (Facepunch.Rust.Profiling.EntityProfiler.mode >= 2)\n\t{\n\t\tFacepunch.Rust.Profiling.EntityProfiler.OnSpawned(this);\n\t}\n\tSpawnShared();\n\tif (net == null)\n\t{\n\t\tnet = Network.Net.sv.CreateNetworkable();\n\t}\n\tcreationFrame = UnityEngine.Time.frameCount;\n\tPreInitShared();\n\tInitShared();\n\tServerInit();\n\tPostInitShared();\n\tUpdateNetworkGroup();\n\tServerInitPostNetworkGroupAssign();\n\tisSpawned = true;\n\tOxide.Core.Interface.CallHook(\"OnEntitySpawned\", this);\n\tSendNetworkUpdateImmediate();\n\tInvoke(SendGlobalNetworkUpdate, 0f);\n\tif (Rust.Application.isLoading && !Rust.Application.isLoadingSave)\n\t{\n\t\tbase.gameObject.SendOnSendNetworkUpdate(this as BaseEntity);\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "Spawn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 304634108,
      "Name": "OnEntityKill",
      "FullName": "OnEntityKill",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is killed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Kill(BaseNetworkable.DestroyMode mode = BaseNetworkable.DestroyMode.None, bool callOnKilled = true)\n{\n\tif (IsDestroyed)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Calling kill - but already IsDestroyed!? \" + this);\n\t}\n\telse if (Oxide.Core.Interface.CallHook(\"OnEntityKill\", this) == null)\n\t{\n\t\tFacepunch.Rust.Profiling.EntityProfiler.killed++;\n\t\tif (Facepunch.Rust.Profiling.EntityProfiler.mode >= 2)\n\t\t{\n\t\t\tFacepunch.Rust.Profiling.EntityProfiler.OnKilled(this);\n\t\t}\n\t\tOnParentDestroyingEx.BroadcastOnParentDestroying(base.gameObject);\n\t\tif (callOnKilled)\n\t\t{\n\t\t\tOnKilled();\n\t\t}\n\t\tDoEntityDestroy();\n\t\tTerminateOnClient(mode);\n\t\tTerminateOnServer();\n\t\tEntityDestroy();\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "Kill",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1024129379,
      "Name": "OnEntitySnapshot",
      "FullName": "OnEntitySnapshot",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        },
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendAsSnapshot(Network.Connection connection, bool ordered = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEntitySnapshot\", this, connection) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tuint val = (ordered ? (++connection.validate.entityUpdates) : uint.MaxValue);\n\t\tBaseNetworkable.SaveInfo saveInfo = default(BaseNetworkable.SaveInfo);\n\t\tsaveInfo.forConnection = connection;\n\t\tsaveInfo.forDisk = false;\n\t\tBaseNetworkable.SaveInfo saveInfo2 = saveInfo;\n\t\tnetWrite.PacketID(Network.Message.Type.Entities);\n\t\tnetWrite.UInt32(val);\n\t\tToStreamForNetwork(netWrite, saveInfo2);\n\t\tnetWrite.Send(new Network.SendInfo(connection));\n\t\tif (Network.DemoConVars.ServerDemosEnabled)\n\t\t{\n\t\t\tlastDemoIndex = Network.Net.sv.serverDemos.DemoCount;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable, Network.Connection connection",
      "TargetName": "BaseNetworkable",
      "MethodName": "SendAsSnapshot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 752002944,
      "Name": "OnEntityLoaded",
      "FullName": "OnEntityLoaded",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is loaded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Load(BaseNetworkable.LoadInfo info)\n{\n\tif (info.msg.baseNetworkable != null)\n\t{\n\t\tBaseNetworkable.LoadInfo loadInfo = info;\n\t\tOxide.Core.Interface.CallHook(\"OnEntityLoaded\", this, info);\n\t\tProtoBuf.BaseNetworkable baseNetworkable = loadInfo.msg.baseNetworkable;\n\t\tif (prefabID != baseNetworkable.prefabID)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(\"Prefab IDs don't match! \" + prefabID + \"/\" + baseNetworkable.prefabID + \" -> \" + base.gameObject, base.gameObject);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "Load",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1024129379,
      "Name": "OnEntitySnapshot",
      "FullName": "OnEntitySnapshot [BaseNetworkable NetWrite]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        },
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendAsSnapshot(Network.Connection connection, bool ordered = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEntitySnapshot\", this, connection) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tuint val = (ordered ? (++connection.validate.entityUpdates) : uint.MaxValue);\n\t\tBaseNetworkable.SaveInfo saveInfo = default(BaseNetworkable.SaveInfo);\n\t\tsaveInfo.forConnection = connection;\n\t\tsaveInfo.forDisk = false;\n\t\tBaseNetworkable.SaveInfo saveInfo2 = saveInfo;\n\t\tnetWrite.PacketID(Network.Message.Type.Entities);\n\t\tnetWrite.UInt32(val);\n\t\tToStreamForNetwork(netWrite, saveInfo2);\n\t\tnetWrite.Send(new Network.SendInfo(connection));\n\t\tif (Network.DemoConVars.ServerDemosEnabled)\n\t\t{\n\t\t\tlastDemoIndex = Network.Net.sv.serverDemos.DemoCount;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable, Network.Connection connection",
      "TargetName": "BaseNetworkable",
      "MethodName": "SendAsSnapshot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1472985181,
      "Name": "OnEntityEnter",
      "FullName": "OnEntityEnter",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "triggerBase",
          "typeName": "TriggerBase",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity enters."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnEntityEnter(BaseEntity ent)\n{\n\tif (!(ent == null))\n\t{\n\t\tif (entityContents == null)\n\t\t{\n\t\t\tentityContents = new System.Collections.Generic.HashSet<BaseEntity>();\n\t\t}\n\t\tif (Oxide.Core.Interface.CallHook(\"OnEntityEnter\", this, ent) == null)\n\t\t{\n\t\t\tentityContents.Add(ent);\n\t\t\tOnEntityEnterTrigger?.Invoke(ent);\n\t\t}\n\t}\n}\n",
      "ParametersText": "TriggerBase triggerBase",
      "TargetName": "TriggerBase",
      "MethodName": "OnEntityEnter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3459457886,
      "Name": "OnEntityLeave",
      "FullName": "OnEntityLeave",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "triggerBase",
          "typeName": "TriggerBase",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity leaves."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnEntityLeave(BaseEntity ent)\n{\n\tif (entityContents != null && Oxide.Core.Interface.CallHook(\"OnEntityLeave\", this, ent) == null)\n\t{\n\t\tentityContents.Remove(ent);\n\t\tOnEntityLeaveTrigger?.Invoke(ent);\n\t}\n}\n",
      "ParametersText": "TriggerBase triggerBase",
      "TargetName": "TriggerBase",
      "MethodName": "OnEntityLeave",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3682863970,
      "Name": "OnEntityMarkHostile",
      "FullName": "OnEntityMarkHostile",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseCombatEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity mark hostile occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void MarkHostileFor(float duration = 60f)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEntityMarkHostile\", this, duration) == null)\n\t{\n\t\tfloat b = UnityEngine.Time.realtimeSinceStartup + duration;\n\t\tunHostileTime = UnityEngine.Mathf.Max(unHostileTime, b);\n\t}\n}\n",
      "ParametersText": "BaseCombatEntity baseCombatEntity",
      "TargetName": "BaseCombatEntity",
      "MethodName": "MarkHostileFor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2286782595,
      "Name": "CanEntityBeHostile",
      "FullName": "CanEntityBeHostile",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseCombatEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to entity be hostile.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool IsHostile()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanEntityBeHostile\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn unHostileTime > UnityEngine.Time.realtimeSinceStartup;\n}\n",
      "ParametersText": "BaseCombatEntity baseCombatEntity",
      "TargetName": "BaseCombatEntity",
      "MethodName": "IsHostile",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1779071345,
      "Name": "OnEntityDeath",
      "FullName": "OnEntityDeath [BaseCombatEntity]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseCombatEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is dead."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Die(HitInfo info = null)\n{\n\tif (IsDead())\n\t{\n\t\treturn;\n\t}\n\tLogEntry(RustLog.EntryType.Combat, 2, \"died\");\n\thealth = 0f;\n\tlifestate = BaseCombatEntity.LifeState.Dead;\n\tOxide.Core.Interface.CallHook(\"OnEntityDeath\", this, info);\n\tif (info != null && info.InitiatorPlayer != null && !info.InitiatorPlayer.IsNpc && info.InitiatorPlayer != this)\n\t{\n\t\tBaseMission.MissionEventPayload missionEventPayload = default(BaseMission.MissionEventPayload);\n\t\tmissionEventPayload.NetworkIdentifier = info.InitiatorPlayer.net.ID;\n\t\tmissionEventPayload.UintIdentifier = prefabID;\n\t\tmissionEventPayload.IntIdentifier = 1;\n\t\tmissionEventPayload.WorldPosition = base.transform.position;\n\t\tBaseMission.MissionEventPayload payload = missionEventPayload;\n\t\tinfo.InitiatorPlayer.ProcessMissionEvent(BaseMission.MissionEventType.KILL_ENTITY, payload, 0f);\n\t\tif (info.InitiatorPlayer.Team != null)\n\t\t{\n\t\t\tfor (int i = 0; i < info.InitiatorPlayer.Team.members.Count; i++)\n\t\t\t{\n\t\t\t\tBasePlayer basePlayer = RelationshipManager.FindByID(info.InitiatorPlayer.Team.members[i]);\n\t\t\t\tif (!(basePlayer == null) && !(basePlayer == info.InitiatorPlayer))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer.ProcessMissionEvent(BaseMission.MissionEventType.KILL_ENTITY, payload, 0f);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tusing (TimeWarning.New(\"OnDied\"))\n\t{\n\t\tTryDropCorpse(info);\n\t\tOnDied(info);\n\t}\n}\n",
      "ParametersText": "BaseCombatEntity baseCombatEntity",
      "TargetName": "BaseCombatEntity",
      "MethodName": "Die",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1524387679,
      "Name": "OnEntityPickedUp",
      "FullName": "OnEntityPickedUp",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseCombatEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity picked up occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnPickedUp(Item createdItem, BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnEntityPickedUp\", this, createdItem, player);\n}\n",
      "ParametersText": "BaseCombatEntity baseCombatEntity",
      "TargetName": "BaseCombatEntity",
      "MethodName": "OnPickedUp",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 883461,
      "Name": "OnEntityGroundMissing",
      "FullName": "OnEntityGroundMissing",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity ground is missing."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnGroundMissing()\n{\n\tBaseEntity baseEntity = UnityEngine.GameObjectEx.ToBaseEntity(base.gameObject);\n\tif (baseEntity != null && Oxide.Core.Interface.CallHook(\"OnEntityGroundMissing\", baseEntity) == null)\n\t{\n\t\tBaseCombatEntity baseCombatEntity = baseEntity as BaseCombatEntity;\n\t\tif (ConVar.Stability.log_ground_missing_death)\n\t\t{\n\t\t\tUnityEngine.Debug.Log($\"Killing '{baseEntity.ToString()}' at position {base.transform.position} due to ground missing\");\n\t\t}\n\t\tif (baseCombatEntity != null)\n\t\t{\n\t\t\tbaseCombatEntity.Die();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseEntity local0",
      "TargetName": "DestroyOnGroundMissing",
      "MethodName": "OnGroundMissing",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2124327688,
      "Name": "OnAirdrop",
      "FullName": "OnAirdrop",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cargoPlane",
          "typeName": "CargoPlane",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when airdrop occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateDropPosition(UnityEngine.Vector3 newDropPosition)\n{\n\tfloat x = TerrainMeta.Size.x;\n\tfloat y = TerrainMeta.HighestPoint.y + 250f;\n\tstartPos = UnityEngine.Vector3Ex.Range(-1f, 1f);\n\tstartPos.y = 0f;\n\tstartPos.Normalize();\n\tstartPos *= x * 2f;\n\tstartPos.y = y;\n\tendPos = startPos * -1f;\n\tendPos.y = startPos.y;\n\tstartPos += newDropPosition;\n\tendPos += newDropPosition;\n\tsecondsToTake = UnityEngine.Vector3.Distance(startPos, endPos) / 50f;\n\tsecondsToTake *= UnityEngine.Random.Range(0.95f, 1.05f);\n\tbase.transform.position = startPos;\n\tbase.transform.rotation = UnityEngine.Quaternion.LookRotation(endPos - startPos);\n\tdropPosition = newDropPosition;\n\tOxide.Core.Interface.CallHook(\"OnAirdrop\", this, newDropPosition);\n}\n",
      "ParametersText": "CargoPlane cargoPlane",
      "TargetName": "CargoPlane",
      "MethodName": "UpdateDropPosition",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2011096229,
      "Name": "OnSupplyDropDropped",
      "FullName": "OnSupplyDropDropped",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "cargoPlane",
          "typeName": "CargoPlane",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a supply drop is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Update()\n{\n\tif (!base.isServer)\n\t{\n\t\treturn;\n\t}\n\tsecondsTaken += UnityEngine.Time.deltaTime;\n\tfloat num = UnityEngine.Mathf.InverseLerp(0f, secondsToTake, secondsTaken);\n\tif (!dropped && num >= 0.5f)\n\t{\n\t\tdropped = true;\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(prefabDrop.resourcePath, base.transform.position);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tbaseEntity.globalBroadcast = true;\n\t\t\tbaseEntity.Spawn();\n\t\t\tOxide.Core.Interface.CallHook(\"OnSupplyDropDropped\", baseEntity, this);\n\t\t}\n\t}\n\tbase.transform.position = UnityEngine.Vector3.Lerp(startPos, endPos, num);\n\tbase.transform.hasChanged = true;\n\tif (num >= 1f)\n\t{\n\t\tKill();\n\t}\n}\n",
      "ParametersText": "BaseEntity local1, CargoPlane cargoPlane",
      "TargetName": "CargoPlane",
      "MethodName": "Update",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3161224964,
      "Name": "OnOvenToggle",
      "FullName": "OnOvenToggle",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an oven toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprotected virtual void SVSwitch(BaseEntity.RPCMessage msg)\n{\n\tbool flag = msg.read.Bit();\n\tif (Oxide.Core.Interface.CallHook(\"OnOvenToggle\", this, msg.player) != null || flag == IsOn() || (needsBuildingPrivilegeToUse && !msg.player.CanBuild()))\n\t{\n\t\treturn;\n\t}\n\tif (flag)\n\t{\n\t\tStartCooking();\n\t\tif (msg.player != null)\n\t\t{\n\t\t\tmsg.player.ProcessMissionEvent(BaseMission.MissionEventType.STARTOVEN, new BaseMission.MissionEventPayload\n\t\t\t{\n\t\t\t\tUintIdentifier = prefabID,\n\t\t\t\tNetworkIdentifier = net.ID\n\t\t\t}, 1f);\n\t\t}\n\t}\n\telse\n\t{\n\t\tStopCooking();\n\t}\n}\n",
      "ParametersText": "BaseOven baseOven, BasePlayer player",
      "TargetName": "BaseOven",
      "MethodName": "SVSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2953430851,
      "Name": "OnOvenCook",
      "FullName": "OnOvenCook",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an oven cooks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Cook(float deltaTime)\n{\n\tif (HasFlag(BaseEntity.Flags.Reserved8))\n\t{\n\t\treturn;\n\t}\n\tItem item = FindBurnable();\n\tif (Oxide.Core.Interface.CallHook(\"OnOvenCook\", this, item) != null)\n\t{\n\t\treturn;\n\t}\n\tif (item == null && !CanRunWithNoFuel)\n\t{\n\t\tStopCooking();\n\t\treturn;\n\t}\n\tforeach (Item item2 in base.inventory.itemList)\n\t{\n\t\tif (item2.position >= _inputSlotIndex && item2.position < _inputSlotIndex + inputSlots && !item2.HasFlag(Item.Flag.Cooking))\n\t\t{\n\t\t\titem2.SetFlag(Item.Flag.Cooking, b: true);\n\t\t\titem2.MarkDirty();\n\t\t}\n\t}\n\tIncreaseCookTime(deltaTime * GetSmeltingSpeed());\n\tBaseEntity slot = GetSlot(BaseEntity.Slot.FireMod);\n\tif ((bool)slot)\n\t{\n\t\tslot.SendMessage(\"Cook\", deltaTime, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t}\n\tif (item != null)\n\t{\n\t\tItemModBurnable itemModBurnable = item.info.ItemModBurnable;\n\t\titem.fuel -= deltaTime * (cookingTemperature / 200f);\n\t\tif (!item.HasFlag(Item.Flag.OnFire))\n\t\t{\n\t\t\titem.SetFlag(Item.Flag.OnFire, b: true);\n\t\t\titem.MarkDirty();\n\t\t}\n\t\tif (item.fuel <= 0f)\n\t\t{\n\t\t\tConsumeFuel(item, itemModBurnable);\n\t\t}\n\t}\n\tOnCooked();\n\tOxide.Core.Interface.CallHook(\"OnOvenCooked\", this, item, slot);\n}\n",
      "ParametersText": "BaseOven baseOven, Item local0",
      "TargetName": "BaseOven",
      "MethodName": "Cook",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2286620090,
      "Name": "OnOvenCooked",
      "FullName": "OnOvenCooked",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an oven is cooked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Cook(float deltaTime)\n{\n\tif (HasFlag(BaseEntity.Flags.Reserved8))\n\t{\n\t\treturn;\n\t}\n\tItem item = FindBurnable();\n\tif (Oxide.Core.Interface.CallHook(\"OnOvenCook\", this, item) != null)\n\t{\n\t\treturn;\n\t}\n\tif (item == null && !CanRunWithNoFuel)\n\t{\n\t\tStopCooking();\n\t\treturn;\n\t}\n\tforeach (Item item2 in base.inventory.itemList)\n\t{\n\t\tif (item2.position >= _inputSlotIndex && item2.position < _inputSlotIndex + inputSlots && !item2.HasFlag(Item.Flag.Cooking))\n\t\t{\n\t\t\titem2.SetFlag(Item.Flag.Cooking, b: true);\n\t\t\titem2.MarkDirty();\n\t\t}\n\t}\n\tIncreaseCookTime(deltaTime * GetSmeltingSpeed());\n\tBaseEntity slot = GetSlot(BaseEntity.Slot.FireMod);\n\tif ((bool)slot)\n\t{\n\t\tslot.SendMessage(\"Cook\", deltaTime, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t}\n\tif (item != null)\n\t{\n\t\tItemModBurnable itemModBurnable = item.info.ItemModBurnable;\n\t\titem.fuel -= deltaTime * (cookingTemperature / 200f);\n\t\tif (!item.HasFlag(Item.Flag.OnFire))\n\t\t{\n\t\t\titem.SetFlag(Item.Flag.OnFire, b: true);\n\t\t\titem.MarkDirty();\n\t\t}\n\t\tif (item.fuel <= 0f)\n\t\t{\n\t\t\tConsumeFuel(item, itemModBurnable);\n\t\t}\n\t}\n\tOnCooked();\n\tOxide.Core.Interface.CallHook(\"OnOvenCooked\", this, item, slot);\n}\n",
      "ParametersText": "BaseOven baseOven, Item local0, BaseEntity local1",
      "TargetName": "BaseOven",
      "MethodName": "Cook",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3058831159,
      "Name": "OnOvenStart",
      "FullName": "OnOvenStart",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an oven starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void StartCooking()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnOvenStart\", this) == null && (FindBurnable() != null || CanRunWithNoFuel))\n\t{\n\t\tbase.inventory.temperature = cookingTemperature;\n\t\tUpdateAttachmentTemperature();\n\t\tcookQueue.Add(this);\n\t\tlastCookUpdate = 0f;\n\t\tlastCookVisualsUpdate = 0f;\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tOxide.Core.Interface.CallHook(\"OnOvenStarted\", this);\n\t\tif (hasOpenFlame)\n\t\t{\n\t\t\tSingletonComponent<NpcFireManager>.Instance.Add(this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseOven baseOven",
      "TargetName": "BaseOven",
      "MethodName": "StartCooking",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 743527400,
      "Name": "OnOvenStarted",
      "FullName": "OnOvenStarted",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an oven starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void StartCooking()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnOvenStart\", this) == null && (FindBurnable() != null || CanRunWithNoFuel))\n\t{\n\t\tbase.inventory.temperature = cookingTemperature;\n\t\tUpdateAttachmentTemperature();\n\t\tcookQueue.Add(this);\n\t\tlastCookUpdate = 0f;\n\t\tlastCookVisualsUpdate = 0f;\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tOxide.Core.Interface.CallHook(\"OnOvenStarted\", this);\n\t\tif (hasOpenFlame)\n\t\t{\n\t\t\tSingletonComponent<NpcFireManager>.Instance.Add(this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseOven baseOven",
      "TargetName": "BaseOven",
      "MethodName": "StartCooking",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 365560906,
      "Name": "OnOvenTemperature",
      "FullName": "OnOvenTemperature",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when oven temperature occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public float GetTemperature(int slot)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnOvenTemperature\", this, slot);\n\tif (obj is float)\n\t{\n\t\treturn (float)obj;\n\t}\n\tif (!HasFlag(BaseEntity.Flags.On))\n\t{\n\t\treturn 15f;\n\t}\n\treturn cookingTemperature;\n}\n",
      "ParametersText": "BaseOven baseOven",
      "TargetName": "BaseOven",
      "MethodName": "GetTemperature",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "float"
    },
    {
      "Id": 3180050887,
      "Name": "OnRecyclerToggle",
      "FullName": "OnRecyclerToggle",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "recycler",
          "typeName": "Recycler",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a recycler toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void SVSwitch(BaseEntity.RPCMessage msg)\n{\n\tbool flag = msg.read.Bit();\n\tif (flag == IsOn() || msg.player == null || Oxide.Core.Interface.CallHook(\"OnRecyclerToggle\", this, msg.player) != null || (!flag && onlyOneUser && msg.player.inventory.loot.entitySource != this) || (flag && !HasRecyclable()))\n\t{\n\t\treturn;\n\t}\n\tif (flag)\n\t{\n\t\tforeach (Item item in base.inventory.itemList)\n\t\t{\n\t\t\titem.CollectedForCrafting(msg.player);\n\t\t}\n\t\tStartRecycling();\n\t}\n\telse\n\t{\n\t\tStopRecycling();\n\t}\n}\n",
      "ParametersText": "Recycler recycler, BasePlayer player",
      "TargetName": "Recycler",
      "MethodName": "SVSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3924237854,
      "Name": "OnContainerDropItems",
      "FullName": "OnContainerDropItems",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "container",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when container drop items occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void DropItems(ItemContainer container, UnityEngine.Vector3 position)\n{\n\tif (!ConVar.Server.dropitems || container == null || container.itemList == null || Oxide.Core.Interface.CallHook(\"OnContainerDropItems\", container) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = 0.25f;\n\tItem[] array = container.itemList.ToArray();\n\tforeach (Item item in array)\n\t{\n\t\tfloat num2 = UnityEngine.Random.Range(0f, 2f);\n\t\titem.RemoveFromContainer();\n\t\tBaseEntity baseEntity = item.CreateWorldObject(position + new UnityEngine.Vector3(UnityEngine.Random.Range(0f - num, num), 1f, UnityEngine.Random.Range(0f - num, num)));\n\t\tif (baseEntity == null)\n\t\t{\n\t\t\titem.Remove();\n\t\t\tcontinue;\n\t\t}\n\t\tif (baseEntity is DroppedItem droppedItem && container.entityOwner is LootContainer)\n\t\t{\n\t\t\tdroppedItem.DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t}\n\t\tif (num2 > 0f)\n\t\t{\n\t\t\tbaseEntity.SetVelocity(new UnityEngine.Vector3(UnityEngine.Random.Range(-1f, 1f), UnityEngine.Random.Range(0f, 1f), UnityEngine.Random.Range(-1f, 1f)) * num2);\n\t\t\tbaseEntity.SetAngularVelocity(new UnityEngine.Vector3(UnityEngine.Random.Range(-10f, 10f), UnityEngine.Random.Range(-10f, 10f), UnityEngine.Random.Range(-10f, 10f)) * num2);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ItemContainer container",
      "TargetName": "DropUtil",
      "MethodName": "DropItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2026747374,
      "Name": "OnEntityDismounted",
      "FullName": "OnEntityDismounted",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DismountPlayer(BasePlayer player, bool lite = false)\n{\n\tif (_mounted == null || _mounted != player || Oxide.Core.Interface.CallHook(\"CanDismountEntity\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (!ShouldRepositionPerFrame())\n\t{\n\t\t_mounted.SetParent(null, worldPositionStays: true, sendImmediate: true);\n\t}\n\tBaseVehicle baseVehicle = VehicleParent();\n\tif (lite)\n\t{\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t\t}\n\t\t_mounted.DismountObject();\n\t\t_mounted = null;\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PlayerDismounted(player, this);\n\t\t}\n\t\tOnPlayerDismounted(player);\n\t\tOxide.Core.Interface.CallHook(\"OnEntityDismounted\", this, player);\n\t\treturn;\n\t}\n\tif (!GetDismountPosition(player, out var res) || Distance(res) > 10f)\n\t{\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t\t}\n\t\tres = player.transform.position;\n\t\t_mounted.DismountObject();\n\t\t_mounted.MovePosition(res);\n\t\t_mounted.transform.rotation = UnityEngine.Quaternion.identity;\n\t\t_mounted.ClientRPC(RpcTarget.Player(\"ForcePositionTo\", _mounted), res);\n\t\tBasePlayer mounted = _mounted;\n\t\t_mounted = null;\n\t\tUnityEngine.Debug.LogWarning(\"Killing player due to invalid dismount point :\" + player.displayName + \" / \" + player.userID.Get() + \" on obj : \" + base.gameObject.name);\n\t\tmounted.Hurt(1000f, Rust.DamageType.Suicide, mounted, useProtection: false);\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PlayerDismounted(player, this);\n\t\t}\n\t\tOnPlayerDismounted(player);\n\t\treturn;\n\t}\n\tif (baseVehicle != null)\n\t{\n\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t}\n\tif (AntiHack.TestNoClipping(_mounted, res, res, BasePlayer.NoClipRadius(ConVar.AntiHack.noclip_margin), ConVar.AntiHack.noclip_backtracking, out var _, overlapVehicleLayer: true))\n\t{\n\t\t_mounted.PauseVehicleNoClipDetection(5f);\n\t}\n\t_mounted.DismountObject();\n\t_mounted.transform.rotation = UnityEngine.Quaternion.LookRotation(UnityEngine.Vector3.forward, UnityEngine.Vector3.up);\n\t_mounted.OverrideViewAngles(UnityEngine.Vector3.zero);\n\t_mounted.MovePosition(res);\n\t_mounted.ForceUpdateTriggers();\n\t_mounted.SendNetworkUpdateImmediate();\n\t_mounted.SendModelState(force: true);\n\t_mounted = null;\n\tif (baseVehicle != null)\n\t{\n\t\tbaseVehicle.PlayerDismounted(player, this);\n\t}\n\tif (player.net != null)\n\t{\n\t\tif ((bool)player.GetParentEntity())\n\t\t{\n\t\t\tBaseEntity baseEntity = player.GetParentEntity();\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"ForcePositionToParentOffset\", player), baseEntity.transform.InverseTransformPoint(res), baseEntity.net.ID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"ForcePositionTo\", player), res);\n\t\t\tplayer.ClientRPC(RpcTarget.NetworkGroup(\"ForceResetRotation\", player));\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnDismountEntity(player, this, baseVehicle);\n\tOxide.Core.Interface.CallHook(\"OnEntityDismounted\", this, player);\n\tOnPlayerDismounted(player);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BaseMountable baseMountable, BasePlayer player",
      "TargetName": "BaseMountable",
      "MethodName": "DismountPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2026747374,
      "Name": "OnEntityDismounted",
      "FullName": "OnEntityDismounted [lite]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DismountPlayer(BasePlayer player, bool lite = false)\n{\n\tif (_mounted == null || _mounted != player || Oxide.Core.Interface.CallHook(\"CanDismountEntity\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (!ShouldRepositionPerFrame())\n\t{\n\t\t_mounted.SetParent(null, worldPositionStays: true, sendImmediate: true);\n\t}\n\tBaseVehicle baseVehicle = VehicleParent();\n\tif (lite)\n\t{\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t\t}\n\t\t_mounted.DismountObject();\n\t\t_mounted = null;\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PlayerDismounted(player, this);\n\t\t}\n\t\tOnPlayerDismounted(player);\n\t\tOxide.Core.Interface.CallHook(\"OnEntityDismounted\", this, player);\n\t\treturn;\n\t}\n\tif (!GetDismountPosition(player, out var res) || Distance(res) > 10f)\n\t{\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t\t}\n\t\tres = player.transform.position;\n\t\t_mounted.DismountObject();\n\t\t_mounted.MovePosition(res);\n\t\t_mounted.transform.rotation = UnityEngine.Quaternion.identity;\n\t\t_mounted.ClientRPC(RpcTarget.Player(\"ForcePositionTo\", _mounted), res);\n\t\tBasePlayer mounted = _mounted;\n\t\t_mounted = null;\n\t\tUnityEngine.Debug.LogWarning(\"Killing player due to invalid dismount point :\" + player.displayName + \" / \" + player.userID.Get() + \" on obj : \" + base.gameObject.name);\n\t\tmounted.Hurt(1000f, Rust.DamageType.Suicide, mounted, useProtection: false);\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PlayerDismounted(player, this);\n\t\t}\n\t\tOnPlayerDismounted(player);\n\t\treturn;\n\t}\n\tif (baseVehicle != null)\n\t{\n\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t}\n\tif (AntiHack.TestNoClipping(_mounted, res, res, BasePlayer.NoClipRadius(ConVar.AntiHack.noclip_margin), ConVar.AntiHack.noclip_backtracking, out var _, overlapVehicleLayer: true))\n\t{\n\t\t_mounted.PauseVehicleNoClipDetection(5f);\n\t}\n\t_mounted.DismountObject();\n\t_mounted.transform.rotation = UnityEngine.Quaternion.LookRotation(UnityEngine.Vector3.forward, UnityEngine.Vector3.up);\n\t_mounted.OverrideViewAngles(UnityEngine.Vector3.zero);\n\t_mounted.MovePosition(res);\n\t_mounted.ForceUpdateTriggers();\n\t_mounted.SendNetworkUpdateImmediate();\n\t_mounted.SendModelState(force: true);\n\t_mounted = null;\n\tif (baseVehicle != null)\n\t{\n\t\tbaseVehicle.PlayerDismounted(player, this);\n\t}\n\tif (player.net != null)\n\t{\n\t\tif ((bool)player.GetParentEntity())\n\t\t{\n\t\t\tBaseEntity baseEntity = player.GetParentEntity();\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"ForcePositionToParentOffset\", player), baseEntity.transform.InverseTransformPoint(res), baseEntity.net.ID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"ForcePositionTo\", player), res);\n\t\t\tplayer.ClientRPC(RpcTarget.NetworkGroup(\"ForceResetRotation\", player));\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnDismountEntity(player, this, baseVehicle);\n\tOxide.Core.Interface.CallHook(\"OnEntityDismounted\", this, player);\n\tOnPlayerDismounted(player);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BaseMountable baseMountable, BasePlayer player",
      "TargetName": "BaseMountable",
      "MethodName": "DismountPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1392780491,
      "Name": "OnCrateHack",
      "FullName": "OnCrateHack",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hackableLockedCrate",
          "typeName": "HackableLockedCrate",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when crate hack occurs.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartHacking()\n{\n\tOxide.Core.Interface.CallHook(\"OnCrateHack\", this);\n\tBroadcastEntityMessage(\"HackingStarted\", 20f, 257);\n\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\tOnStartHacking();\n\tInvokeRepeating(HackProgress, 1f, 1f);\n\tClientRPC(RpcTarget.NetworkGroup(\"UpdateHackProgress\"), 0, (int)requiredHackSeconds);\n\tRefreshDecay();\n}\n",
      "ParametersText": "HackableLockedCrate hackableLockedCrate",
      "TargetName": "HackableLockedCrate",
      "MethodName": "StartHacking",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1418106200,
      "Name": "OnCrateHackEnd",
      "FullName": "OnCrateHackEnd",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hackableLockedCrate",
          "typeName": "HackableLockedCrate",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a crate hack ends.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void HackProgress()\n{\n\thackSeconds += 1f;\n\tif (hackSeconds > requiredHackSeconds)\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnCrateHackEnd\", this);\n\t\tFacepunch.Rust.Analytics.Azure.OnLockedCrateFinished(originalHackerPlayerId, this);\n\t\tif (originalHackerPlayer != null && originalHackerPlayer.serverClan != null)\n\t\t{\n\t\t\toriginalHackerPlayer.AddClanScore(ClanScoreEventType.HackedCrate);\n\t\t}\n\t\tRefreshDecay();\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b: true);\n\t\tisLootable = true;\n\t\tCancelInvoke(HackProgress);\n\t}\n\tClientRPC(RpcTarget.NetworkGroup(\"UpdateHackProgress\"), (int)hackSeconds, (int)requiredHackSeconds);\n}\n",
      "ParametersText": "HackableLockedCrate hackableLockedCrate",
      "TargetName": "HackableLockedCrate",
      "MethodName": "HackProgress",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4067534188,
      "Name": "OnCrateLanded",
      "FullName": "OnCrateLanded",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hackableLockedCrate",
          "typeName": "HackableLockedCrate",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a crate is landed.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void LandCheck()\n{\n\tif (!hasLanded && UnityEngine.Physics.Raycast(new UnityEngine.Ray(base.transform.position + UnityEngine.Vector3.up * 0.5f, UnityEngine.Vector3.down), out var hitInfo, 1f, 1084293377))\n\t{\n\t\tEffect.server.Run(landEffect.resourcePath, hitInfo.point, UnityEngine.Vector3.up);\n\t\thasLanded = true;\n\t\tOxide.Core.Interface.CallHook(\"OnCrateLanded\", this);\n\t\tCancelInvoke(LandCheck);\n\t}\n}\n",
      "ParametersText": "HackableLockedCrate hackableLockedCrate",
      "TargetName": "HackableLockedCrate",
      "MethodName": "LandCheck",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3643792285,
      "Name": "OnCrateDropped",
      "FullName": "OnCrateDropped",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hackableLockedCrate",
          "typeName": "HackableLockedCrate",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a crate is dropped.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetWasDropped()\n{\n\twasDropped = true;\n\tOxide.Core.Interface.CallHook(\"OnCrateDropped\", this);\n}\n",
      "ParametersText": "HackableLockedCrate hackableLockedCrate",
      "TargetName": "HackableLockedCrate",
      "MethodName": "SetWasDropped",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3125959414,
      "Name": "OnCrateLaptopAttack",
      "FullName": "OnCrateLaptopAttack",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hackableLockedCrate",
          "typeName": "HackableLockedCrate",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a crate laptop attacks.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnAttacked(HitInfo info)\n{\n\tif (base.isServer)\n\t{\n\t\tif (StringPool.Get(info.HitBone) == \"laptopcollision\")\n\t\t{\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnCrateLaptopAttack\", this, info) != null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tEffect.server.Run(shockEffect.resourcePath, this, info.HitBone, info.HitPositionLocal, UnityEngine.Vector3.up);\n\t\t\thackSeconds -= 8f * (info.damageTypes.Total() / 50f);\n\t\t\tif (hackSeconds < 0f)\n\t\t\t{\n\t\t\t\thackSeconds = 0f;\n\t\t\t}\n\t\t}\n\t\tRefreshDecay();\n\t}\n\tbase.OnAttacked(info);\n}\n",
      "ParametersText": "HackableLockedCrate hackableLockedCrate, HitInfo info",
      "TargetName": "HackableLockedCrate",
      "MethodName": "OnAttacked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 430051754,
      "Name": "OnEntityDestroy",
      "FullName": "OnEntityDestroy [CH47Helicopter]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is destroyed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnDied(HitInfo info)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEntityDestroy\", this) == null)\n\t{\n\t\tif (!OutOfCrates())\n\t\t{\n\t\t\tDropCrate();\n\t\t}\n\t\tbase.OnDied(info);\n\t}\n}\n",
      "ParametersText": "CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "OnDied",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2257502869,
      "Name": "OnArcadeScoreAdded",
      "FullName": "OnArcadeScoreAdded",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseArcadeMachine",
          "typeName": "BaseArcadeMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "score",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an arcade score is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AddScore(BasePlayer player, int score)\n{\n\tBaseArcadeMachine.ScoreEntry scoreEntry = new BaseArcadeMachine.ScoreEntry();\n\tscoreEntry.displayName = player.displayName;\n\tscoreEntry.score = score;\n\tscoreEntry.playerID = player.userID;\n\tscores.Add(scoreEntry);\n\tscores.Sort((BaseArcadeMachine.ScoreEntry a, BaseArcadeMachine.ScoreEntry b) => b.score.CompareTo(a.score));\n\tscores.TrimExcess();\n\tSendNetworkUpdate();\n\tOxide.Core.Interface.CallHook(\"OnArcadeScoreAdded\", this, player, score);\n}\n",
      "ParametersText": "BaseArcadeMachine baseArcadeMachine, BasePlayer player, int score",
      "TargetName": "BaseArcadeMachine",
      "MethodName": "AddScore",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2286782595,
      "Name": "CanEntityBeHostile",
      "FullName": "CanEntityBeHostile [BasePlayer]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to entity be hostile.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool IsHostile()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanEntityBeHostile\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn State.unHostileTimestamp > Network.TimeEx.currentTimestamp;\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "IsHostile",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3682863970,
      "Name": "OnEntityMarkHostile",
      "FullName": "OnEntityMarkHostile [BasePlayer]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity mark hostile occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void MarkHostileFor(float duration = 60f)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEntityMarkHostile\", this, duration) == null && !IsHostilePaused())\n\t{\n\t\tdouble currentTimestamp = Network.TimeEx.currentTimestamp;\n\t\tdouble val = currentTimestamp + (double)duration;\n\t\tState.unHostileTimestamp = System.Math.Max(State.unHostileTimestamp, val);\n\t\tDirtyPlayerState();\n\t\tdouble num = System.Math.Max(State.unHostileTimestamp - currentTimestamp, 0.0);\n\t\tClientRPC(RpcTarget.Player(\"SetHostileLength\", this), (float)num);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "MarkHostileFor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1024129379,
      "Name": "OnEntitySnapshot",
      "FullName": "OnEntitySnapshot [BasePlayer]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "ent",
          "typeName": "BaseNetworkable",
          "optional": false
        },
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendEntitySnapshot(BaseNetworkable ent)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEntitySnapshot\", ent, net.connection) != null)\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"SendEntitySnapshot\"))\n\t{\n\t\tif (!(ent == null) && ent.net != null && ent.ShouldNetworkTo(this))\n\t\t{\n\t\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\t\tnet.connection.validate.entityUpdates++;\n\t\t\tBaseNetworkable.SaveInfo saveInfo = default(BaseNetworkable.SaveInfo);\n\t\t\tsaveInfo.forConnection = net.connection;\n\t\t\tsaveInfo.forDisk = false;\n\t\t\tBaseNetworkable.SaveInfo saveInfo2 = saveInfo;\n\t\t\tnetWrite.PacketID(Network.Message.Type.Entities);\n\t\t\tnetWrite.UInt32(net.connection.validate.entityUpdates);\n\t\t\tent.ToStreamForNetwork(netWrite, saveInfo2);\n\t\t\tif (Network.PacketProfiler.shouldCaptureDetailedProfiling)\n\t\t\t{\n\t\t\t\tNetwork.PacketProfiler.LogDetailedOutbound(Network.Message.Type.Entities, net.ID, (ent != null) ? ent.PrefabName : null, (int)netWrite.Length, null, Facepunch.Math.Epoch.Current, server: true);\n\t\t\t}\n\t\t\tnetWrite.Send(new Network.SendInfo(net.connection));\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseNetworkable ent, BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "SendEntitySnapshot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 35618031,
      "Name": "CanSeeStash",
      "FullName": "CanSeeStash",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "entity",
          "typeName": "StashContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to see stash.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void CheckStashRevealInvoke()\n{\n\tfor (int i = 0; i < nearbyStashes.Count; i++)\n\t{\n\t\tBasePlayer.NearbyStash nearbyStash = nearbyStashes[i];\n\t\tif (nearbyStash.Entity == null || nearbyStash.Entity.IsDestroyed)\n\t\t{\n\t\t\tnearbyStashes.RemoveAt(i);\n\t\t}\n\t\telse if (nearbyStash.Entity.IsHidden() && nearbyStash.Entity.PlayerInRange(this))\n\t\t{\n\t\t\tnearbyStash.LookingAtTime += StashContainer.PlayerDetectionTickRate;\n\t\t\tif (nearbyStash.LookingAtTime >= nearbyStash.Entity.uncoverTime)\n\t\t\t{\n\t\t\t\tif (Oxide.Core.Interface.CallHook(\"CanSeeStash\", this, nearbyStash.Entity) != null)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tnearbyStash.Entity.SetHidden(isHidden: false);\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnStashRevealed(this, nearbyStash.Entity);\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnStashExposed\", nearbyStash.Entity, this);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnearbyStash.LookingAtTime = 0f;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, StashContainer entity",
      "TargetName": "BasePlayer",
      "MethodName": "CheckStashRevealInvoke",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1506495919,
      "Name": "OnStashExposed",
      "FullName": "OnStashExposed",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "entity",
          "typeName": "StashContainer",
          "optional": false
        },
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a stash is exposed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void CheckStashRevealInvoke()\n{\n\tfor (int i = 0; i < nearbyStashes.Count; i++)\n\t{\n\t\tBasePlayer.NearbyStash nearbyStash = nearbyStashes[i];\n\t\tif (nearbyStash.Entity == null || nearbyStash.Entity.IsDestroyed)\n\t\t{\n\t\t\tnearbyStashes.RemoveAt(i);\n\t\t}\n\t\telse if (nearbyStash.Entity.IsHidden() && nearbyStash.Entity.PlayerInRange(this))\n\t\t{\n\t\t\tnearbyStash.LookingAtTime += StashContainer.PlayerDetectionTickRate;\n\t\t\tif (nearbyStash.LookingAtTime >= nearbyStash.Entity.uncoverTime)\n\t\t\t{\n\t\t\t\tif (Oxide.Core.Interface.CallHook(\"CanSeeStash\", this, nearbyStash.Entity) != null)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tnearbyStash.Entity.SetHidden(isHidden: false);\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnStashRevealed(this, nearbyStash.Entity);\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnStashExposed\", nearbyStash.Entity, this);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnearbyStash.LookingAtTime = 0f;\n\t\t}\n\t}\n}\n",
      "ParametersText": "StashContainer entity, BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "CheckStashRevealInvoke",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1088682450,
      "Name": "CanSamSiteShoot",
      "FullName": "CanSamSiteShoot",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "samSite",
          "typeName": "SamSite",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to sam site shoot.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void WeaponTick()\n{\n\tif (IsDead() || UnityEngine.Time.time < reloadVolleyFinishTime)\n\t{\n\t\treturn;\n\t}\n\tif ((firedCount > 0 && (float)sinceLastRocketFired > autoreloaddelay) || firedCount >= 6)\n\t{\n\t\tReloadVolley();\n\t}\n\telse\n\t{\n\t\tif (UnityEngine.Time.time < lockOnTime)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (!IsPowered())\n\t\t{\n\t\t\tfiredCount = 0;\n\t\t\treturn;\n\t\t}\n\t\tEnsureAmmoLoaded();\n\t\tif (Oxide.Core.Interface.CallHook(\"CanSamSiteShoot\", this) == null && HasAmmo())\n\t\t{\n\t\t\tbool num = ammoItem != null && ammoItem.amount == lowAmmoThreshold;\n\t\t\tif (!staticRespawn && ammoItem != null)\n\t\t\t{\n\t\t\t\tammoItem.UseItem();\n\t\t\t}\n\t\t\tfiredCount++;\n\t\t\tsinceLastRocketFired = 0f;\n\t\t\tfloat speedMultiplier = 1f;\n\t\t\tif (!ObjectEx.IsUnityNull(currentTarget))\n\t\t\t{\n\t\t\t\tspeedMultiplier = currentTarget.SAMTargetType.speedMultiplier;\n\t\t\t}\n\t\t\tFireProjectile(tubes[currentTubeIndex].position, currentAimDir, speedMultiplier);\n\t\t\tEffect.server.Run(muzzleFlashTest.resourcePath, this, StringPool.Get(\"Tube \" + (currentTubeIndex + 1)), UnityEngine.Vector3.zero, UnityEngine.Vector3.up);\n\t\t\tcurrentTubeIndex++;\n\t\t\tif (currentTubeIndex >= tubes.Length)\n\t\t\t{\n\t\t\t\tcurrentTubeIndex = 0;\n\t\t\t}\n\t\t\tif (num)\n\t\t\t{\n\t\t\t\tMarkIODirty();\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "SamSite samSite",
      "TargetName": "SamSite",
      "MethodName": "WeaponTick",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2988092440,
      "Name": "OnSamSiteModeToggle",
      "FullName": "OnSamSiteModeToggle",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "samSite",
          "typeName": "SamSite",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sam site mode toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void ToggleDefenderMode(BaseEntity.RPCMessage msg)\n{\n\tif (staticRespawn)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && player.CanBuild())\n\t{\n\t\tbool flag = msg.read.Bit();\n\t\tif (flag != IsInDefenderMode() && Oxide.Core.Interface.CallHook(\"OnSamSiteModeToggle\", this, player, flag) == null)\n\t\t{\n\t\t\tSetFlag(Flag_ManuallySetMode, flag);\n\t\t\tSetFlag(Flag_TargetMode, flag);\n\t\t}\n\t}\n}\n",
      "ParametersText": "SamSite samSite, BasePlayer local0, bool local1",
      "TargetName": "SamSite",
      "MethodName": "ToggleDefenderMode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1813715233,
      "Name": "OnSamSiteTarget",
      "FullName": "OnSamSiteTarget",
      "Category": "Entity",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when sam site target occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TargetScan()\n{\n\tif (!IsPowered())\n\t{\n\t\tlastTargetVisibleTime = 0f;\n\t\treturn;\n\t}\n\tif (UnityEngine.Time.time > lastTargetVisibleTime + 3f)\n\t{\n\t\tClearTarget();\n\t}\n\tif (!staticRespawn)\n\t{\n\t\tint num = ((ammoItem != null && ammoItem.parent == base.inventory) ? ammoItem.amount : 0);\n\t\tbool flag = lastAmmoCount < lowAmmoThreshold;\n\t\tbool flag2 = num < lowAmmoThreshold;\n\t\tif (num != lastAmmoCount && flag != flag2)\n\t\t{\n\t\t\tMarkIODirty();\n\t\t}\n\t\tlastAmmoCount = num;\n\t}\n\tif (HasValidTarget() || IsDead())\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<SamSite.ISamSiteTarget> obj = Facepunch.Pool.Get<System.Collections.Generic.List<SamSite.ISamSiteTarget>>();\n\tif (Oxide.Core.Interface.CallHook(\"OnSamSiteTargetScan\", this, obj) == null)\n\t{\n\t\tif (!IsInDefenderMode())\n\t\t{\n\t\t\tAddTargetSet(obj, targetTypeVehicle.scanRadius);\n\t\t}\n\t\tAddMLRSRockets(obj, targetTypeMissile.scanRadius);\n\t}\n\tSamSite.ISamSiteTarget samSiteTarget = null;\n\tforeach (SamSite.ISamSiteTarget item in obj)\n\t{\n\t\tif (!item.isClient && !(item.CenterPoint().y < eyePoint.transform.position.y) && item.IsVisible(eyePoint.transform.position, item.SAMTargetType.scanRadius * 2f) && item.IsValidSAMTarget(staticRespawn) && Oxide.Core.Interface.CallHook(\"OnSamSiteTarget\", this, item) == null)\n\t\t{\n\t\t\tsamSiteTarget = item;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!ObjectEx.IsUnityNull(samSiteTarget) && currentTarget != samSiteTarget)\n\t{\n\t\tlockOnTime = UnityEngine.Time.time + 0.5f;\n\t}\n\tSetTarget(samSiteTarget);\n\tif (!ObjectEx.IsUnityNull(currentTarget))\n\t{\n\t\tlastTargetVisibleTime = UnityEngine.Time.time;\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\tif (ObjectEx.IsUnityNull(currentTarget))\n\t{\n\t\tCancelInvoke(WeaponTick);\n\t}\n\telse\n\t{\n\t\tInvokeRandomized(WeaponTick, 0f, 0.5f, 0.2f);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "SamSite",
      "MethodName": "TargetScan",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 148431210,
      "Name": "OnSamSiteTargetScan",
      "FullName": "OnSamSiteTargetScan",
      "Category": "Entity",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when sam site target scan occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TargetScan()\n{\n\tif (!IsPowered())\n\t{\n\t\tlastTargetVisibleTime = 0f;\n\t\treturn;\n\t}\n\tif (UnityEngine.Time.time > lastTargetVisibleTime + 3f)\n\t{\n\t\tClearTarget();\n\t}\n\tif (!staticRespawn)\n\t{\n\t\tint num = ((ammoItem != null && ammoItem.parent == base.inventory) ? ammoItem.amount : 0);\n\t\tbool flag = lastAmmoCount < lowAmmoThreshold;\n\t\tbool flag2 = num < lowAmmoThreshold;\n\t\tif (num != lastAmmoCount && flag != flag2)\n\t\t{\n\t\t\tMarkIODirty();\n\t\t}\n\t\tlastAmmoCount = num;\n\t}\n\tif (HasValidTarget() || IsDead())\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<SamSite.ISamSiteTarget> obj = Facepunch.Pool.Get<System.Collections.Generic.List<SamSite.ISamSiteTarget>>();\n\tif (Oxide.Core.Interface.CallHook(\"OnSamSiteTargetScan\", this, obj) == null)\n\t{\n\t\tif (!IsInDefenderMode())\n\t\t{\n\t\t\tAddTargetSet(obj, targetTypeVehicle.scanRadius);\n\t\t}\n\t\tAddMLRSRockets(obj, targetTypeMissile.scanRadius);\n\t}\n\tSamSite.ISamSiteTarget samSiteTarget = null;\n\tforeach (SamSite.ISamSiteTarget item in obj)\n\t{\n\t\tif (!item.isClient && !(item.CenterPoint().y < eyePoint.transform.position.y) && item.IsVisible(eyePoint.transform.position, item.SAMTargetType.scanRadius * 2f) && item.IsValidSAMTarget(staticRespawn) && Oxide.Core.Interface.CallHook(\"OnSamSiteTarget\", this, item) == null)\n\t\t{\n\t\t\tsamSiteTarget = item;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!ObjectEx.IsUnityNull(samSiteTarget) && currentTarget != samSiteTarget)\n\t{\n\t\tlockOnTime = UnityEngine.Time.time + 0.5f;\n\t}\n\tSetTarget(samSiteTarget);\n\tif (!ObjectEx.IsUnityNull(currentTarget))\n\t{\n\t\tlastTargetVisibleTime = UnityEngine.Time.time;\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\tif (ObjectEx.IsUnityNull(currentTarget))\n\t{\n\t\tCancelInvoke(WeaponTick);\n\t}\n\telse\n\t{\n\t\tInvokeRandomized(WeaponTick, 0f, 0.5f, 0.2f);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "SamSite",
      "MethodName": "TargetScan",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4040320602,
      "Name": "OnSwitchToggle",
      "FullName": "OnSwitchToggle [ElectricSwitch]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "electricSwitch",
          "typeName": "ElectricSwitch",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a switch toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_Switch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnSwitchToggle\", this, msg.player) == null)\n\t{\n\t\tbool @switch = msg.read.Bool();\n\t\tSetSwitch(@switch);\n\t\tOxide.Core.Interface.CallHook(\"OnSwitchToggled\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "ElectricSwitch electricSwitch, BasePlayer player",
      "TargetName": "ElectricSwitch",
      "MethodName": "RPC_Switch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 588890708,
      "Name": "OnSwitchToggled",
      "FullName": "OnSwitchToggled [ElectricSwitch]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "electricSwitch",
          "typeName": "ElectricSwitch",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a switch toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_Switch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnSwitchToggle\", this, msg.player) == null)\n\t{\n\t\tbool @switch = msg.read.Bool();\n\t\tSetSwitch(@switch);\n\t\tOxide.Core.Interface.CallHook(\"OnSwitchToggled\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "ElectricSwitch electricSwitch, BasePlayer player",
      "TargetName": "ElectricSwitch",
      "MethodName": "RPC_Switch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 952055589,
      "Name": "OnEntityTakeDamage",
      "FullName": "OnEntityTakeDamage [ResourceEntity]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "resourceEntity",
          "typeName": "ResourceEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity take is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnAttacked(HitInfo info)\n{\n\tif (!base.isServer || isKilled || Oxide.Core.Interface.CallHook(\"OnEntityTakeDamage\", this, info) != null)\n\t{\n\t\treturn;\n\t}\n\tif (resourceDispenser != null)\n\t{\n\t\tresourceDispenser.OnResourceDispenserAttacked(info);\n\t}\n\tif (!info.DidGather)\n\t{\n\t\tif ((bool)baseProtection)\n\t\t{\n\t\t\tbaseProtection.Scale(info.damageTypes);\n\t\t}\n\t\tfloat num = info.damageTypes.Total();\n\t\thealth -= num;\n\t\tif (health <= 0f)\n\t\t{\n\t\t\tOnDied(info);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOnHealthChanged();\n\t\t}\n\t}\n}\n",
      "ParametersText": "ResourceEntity resourceEntity",
      "TargetName": "ResourceEntity",
      "MethodName": "OnAttacked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1779071345,
      "Name": "OnEntityDeath",
      "FullName": "OnEntityDeath [ResourceEntity]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "resourceEntity",
          "typeName": "ResourceEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is dead."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnDied(HitInfo info)\n{\n\tisKilled = true;\n\tOxide.Core.Interface.CallHook(\"OnEntityDeath\", this, info);\n\tKill();\n}\n",
      "ParametersText": "ResourceEntity resourceEntity",
      "TargetName": "ResourceEntity",
      "MethodName": "OnDied",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 164052317,
      "Name": "OnSupplyDropLanded",
      "FullName": "OnSupplyDropLanded",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "supplyDrop",
          "typeName": "SupplyDrop",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a supply drop is landed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnCollisionEnter(UnityEngine.Collision collision)\n{\n\tbool flag = ((1 << collision.collider.gameObject.layer) & 0x40A10111) > 0;\n\tbool num = ((1 << collision.collider.gameObject.layer) & 0x8000000) > 0;\n\tBaseEntity entity = UnityEngine.CollisionEx.GetEntity(collision);\n\tif (num && entity is Tugboat)\n\t{\n\t\tflag = true;\n\t}\n\tif (num && (entity is BoatBuildingBlock || PlayerBoat.IsChildOfFinishedPlayerBoat(entity)))\n\t{\n\t\tflag = true;\n\t}\n\tif (flag)\n\t{\n\t\tRemoveParachute();\n\t\tMakeLootable();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnSupplyDropLanded\", this);\n}\n",
      "ParametersText": "SupplyDrop supplyDrop",
      "TargetName": "SupplyDrop",
      "MethodName": "OnCollisionEnter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1472985181,
      "Name": "OnEntityEnter",
      "FullName": "OnEntityEnter [TriggerComfort]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "triggerComfort",
          "typeName": "TriggerComfort",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity enters."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnEntityEnter(BaseEntity ent)\n{\n\tif ((ent is BasePlayer || ent is RidableHorse || ent is RidableHorse) && Oxide.Core.Interface.CallHook(\"OnEntityEnter\", this, ent) == null)\n\t{\n\t\t_entities.Add(ent);\n\t}\n}\n",
      "ParametersText": "TriggerComfort triggerComfort",
      "TargetName": "TriggerComfort",
      "MethodName": "OnEntityEnter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3459457886,
      "Name": "OnEntityLeave",
      "FullName": "OnEntityLeave [TriggerComfort]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "triggerComfort",
          "typeName": "TriggerComfort",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity leaves."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnEntityLeave(BaseEntity ent)\n{\n\tif ((ent is BasePlayer || ent is RidableHorse || ent is RidableHorse) && Oxide.Core.Interface.CallHook(\"OnEntityLeave\", this, ent) == null)\n\t{\n\t\t_entities.Remove(ent);\n\t}\n}\n",
      "ParametersText": "TriggerComfort triggerComfort",
      "TargetName": "TriggerComfort",
      "MethodName": "OnEntityLeave",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2857588141,
      "Name": "OnEntityStabilityCheck",
      "FullName": "OnEntityStabilityCheck",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "stabilityEntity",
          "typeName": "StabilityEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity stability check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void StabilityCheck()\n{\n\tif (base.IsDestroyed || Oxide.Core.Interface.CallHook(\"OnEntityStabilityCheck\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (supports == null)\n\t{\n\t\tInitializeSupports();\n\t}\n\tbool flag = false;\n\tint num = DistanceFromGround();\n\tif (num != cachedDistanceFromGround)\n\t{\n\t\tfloat num2 = cachedDistanceFromGround;\n\t\tcachedDistanceFromGround = num;\n\t\tif (!ConVar.Stability.support_highest_stability)\n\t\t{\n\t\t\tif (ConVar.Stability.log_stability_updates)\n\t\t\t{\n\t\t\t\tLogStabilityUpdate($\"old distance : {num2} != new distance {num}\");\n\t\t\t}\n\t\t\tflag = true;\n\t\t}\n\t}\n\tStabilityEntity supportEntity;\n\tfloat num3 = SupportValue(out supportEntity);\n\tif (UnityEngine.Mathf.Abs(cachedStability - num3) > ConVar.Stability.accuracy)\n\t{\n\t\tif (ConVar.Stability.log_stability_updates)\n\t\t{\n\t\t\tLogStabilityUpdate(string.Format(\"old stability: {0} new stability: {1} support entity: {2}\", cachedStability, num3, (supportEntity == null) ? \"null\" : supportEntity.ToString()));\n\t\t}\n\t\tcachedStability = num3;\n\t\tflag = true;\n\t}\n\tif (flag)\n\t{\n\t\tdirty = true;\n\t\tUpdateConnectedEntities();\n\t\tUpdateStability(stabilityUpdateDepth + 1);\n\t}\n\telse if (dirty)\n\t{\n\t\tdirty = false;\n\t\tSendNetworkUpdate();\n\t}\n\tif (num3 < ConVar.Stability.collapse)\n\t{\n\t\tif (stabilityStrikes < ConVar.Stability.strikes)\n\t\t{\n\t\t\tif (ConVar.Stability.log_stability_updates)\n\t\t\t{\n\t\t\t\tLogStabilityUpdate($\"stability strikes {stabilityStrikes} / {ConVar.Stability.strikes}\");\n\t\t\t}\n\t\t\tUpdateStability(stabilityUpdateDepth + 1);\n\t\t\tstabilityStrikes++;\n\t\t\treturn;\n\t\t}\n\t\tif (ConVar.Stability.log_stability_death)\n\t\t{\n\t\t\tUnityEngine.Debug.Log($\"Killing '{ToString()}' at position {base.transform.position} due to low stability: {System.Math.Round(num3 * 100f, 2)} < {System.Math.Round(ConVar.Stability.collapse * 100f, 1)}%\");\n\t\t}\n\t\tKill(BaseNetworkable.DestroyMode.Gib);\n\t}\n\telse\n\t{\n\t\tstabilityStrikes = 0;\n\t}\n}\n",
      "ParametersText": "StabilityEntity stabilityEntity",
      "TargetName": "StabilityEntity",
      "MethodName": "StabilityCheck",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1223867373,
      "Name": "OnDieselEngineToggled",
      "FullName": "OnDieselEngineToggled [off]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "dieselEngine",
          "typeName": "DieselEngine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a diesel engine toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EngineOff()\n{\n\tSetFlag(BaseEntity.Flags.On, b: false);\n\tBroadcastEntityMessage(\"DieselEngineOff\");\n\tOxide.Core.Interface.CallHook(\"OnDieselEngineToggled\", this);\n}\n",
      "ParametersText": "DieselEngine dieselEngine",
      "TargetName": "DieselEngine",
      "MethodName": "EngineOff",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1223867373,
      "Name": "OnDieselEngineToggled",
      "FullName": "OnDieselEngineToggled [on]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "dieselEngine",
          "typeName": "DieselEngine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a diesel engine toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EngineOn()\n{\n\tSetFlag(BaseEntity.Flags.On, b: true);\n\tBroadcastEntityMessage(\"DieselEngineOn\");\n\tOxide.Core.Interface.CallHook(\"OnDieselEngineToggled\", this);\n}\n",
      "ParametersText": "DieselEngine dieselEngine",
      "TargetName": "DieselEngine",
      "MethodName": "EngineOn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3703070184,
      "Name": "OnDieselEngineToggle",
      "FullName": "OnDieselEngineToggle",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "dieselEngine",
          "typeName": "DieselEngine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a diesel engine toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(6f)]\n[BaseEntity.RPC_Server]\npublic void EngineSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnDieselEngineToggle\", this, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tif (msg.read.Bit())\n\t{\n\t\tif (GetFuelAmount() > 0)\n\t\t{\n\t\t\tEngineOn();\n\t\t\tstartedByPlayer = msg.player;\n\t\t\tif (Rust.GameInfo.HasAchievements && msg.player != null)\n\t\t\t{\n\t\t\t\tmsg.player.stats.Add(\"excavator_activated\", 1, Stats.All);\n\t\t\t\tmsg.player.stats.Save(forceSteamSave: true);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tEngineOff();\n\t}\n}\n",
      "ParametersText": "DieselEngine dieselEngine, BasePlayer player",
      "TargetName": "DieselEngine",
      "MethodName": "EngineSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3156555505,
      "Name": "OnBuildingPrivilege",
      "FullName": "OnBuildingPrivilege",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseEntity",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when building privilege occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual BuildingPrivlidge GetBuildingPrivilege()\n{\n\treturn GetNearestBuildingPrivilege(PrivilegeCacheDefaultValue());\n}\n",
      "ParametersText": "BaseEntity baseEntity",
      "TargetName": "BaseEntity",
      "MethodName": "GetBuildingPrivilege",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "BuildingPrivlidge"
    },
    {
      "Id": 1568260765,
      "Name": "OnEntityFlagsNetworkUpdate",
      "FullName": "OnEntityFlagsNetworkUpdate",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseEntity",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity flags network is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendNetworkUpdate_Flags()\n{\n\tif (Rust.Application.isLoading || Rust.Application.isLoadingSave || base.IsDestroyed || net == null || !isSpawned)\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"SendNetworkUpdate_Flags\"))\n\t{\n\t\tLogEntry(RustLog.EntryType.Network, 3, \"SendNetworkUpdate_Flags\");\n\t\tif (Oxide.Core.Interface.CallHook(\"OnEntityFlagsNetworkUpdate\", this) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tSystem.Collections.Generic.List<Network.Connection> subscribers = GetSubscribers();\n\t\tif (subscribers != null && subscribers.Count > 0)\n\t\t{\n\t\t\tSendDemoTransientEntity();\n\t\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\t\tnetWrite.PacketID(Network.Message.Type.EntityFlags);\n\t\t\tnetWrite.EntityID(net.ID);\n\t\t\tnetWrite.Int32((int)flags);\n\t\t\tNetwork.SendInfo info = new Network.SendInfo(subscribers);\n\t\t\tif (Network.PacketProfiler.shouldCaptureDetailedProfiling)\n\t\t\t{\n\t\t\t\tBaseEntity baseEntity = BaseNetworkable.serverEntities.Find(net.ID) as BaseEntity;\n\t\t\t\tNetwork.PacketProfiler.LogDetailedOutbound(Network.Message.Type.EntityFlags, net.ID, (baseEntity != null) ? baseEntity.PrefabName : null, (int)netWrite.Length, null, Facepunch.Math.Epoch.Current, server: true, flags.ToString());\n\t\t\t}\n\t\t\tnetWrite.Send(info);\n\t\t}\n\t\tbase.gameObject.SendOnSendNetworkUpdate(this);\n\t}\n}\n",
      "ParametersText": "BaseEntity baseEntity",
      "TargetName": "BaseEntity",
      "MethodName": "SendNetworkUpdate_Flags",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3349644214,
      "Name": "OnCargoShipEgress",
      "FullName": "OnCargoShipEgress",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cargoShip",
          "typeName": "CargoShip",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a cargo ship egresses."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartEgress()\n{\n\tif (!isDoingHarborApproach && !egressing)\n\t{\n\t\tegressing = true;\n\t\tif (Oxide.Core.Interface.CallHook(\"OnCargoShipEgress\", this) == null)\n\t\t{\n\t\t\tCancelInvoke(PlayHorn);\n\t\t\tradiation.SetActive(value: true);\n\t\t\tSetFlag(BaseEntity.Flags.Reserved8, b: true);\n\t\t\tInvokeRepeating(UpdateRadiation, 10f, 1f);\n\t\t\tInvoke(DelayedDestroy, 60f * egress_duration_minutes);\n\t\t}\n\t}\n}\n",
      "ParametersText": "CargoShip cargoShip",
      "TargetName": "CargoShip",
      "MethodName": "StartEgress",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1757939003,
      "Name": "OnCargoShipSpawnCrate",
      "FullName": "OnCargoShipSpawnCrate",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cargoShip",
          "typeName": "CargoShip",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cargo ship spawn crate occurs.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RespawnLoot()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnCargoShipSpawnCrate\", this) == null)\n\t{\n\t\tInvokeRepeating(PlayHorn, 0f, 8f);\n\t\tSpawnCrate(lockedCratePrefab.resourcePath);\n\t\tSpawnCrate(eliteCratePrefab.resourcePath);\n\t\tfor (int i = 0; i < 4; i++)\n\t\t{\n\t\t\tSpawnCrate(militaryCratePrefab.resourcePath);\n\t\t}\n\t\tfor (int j = 0; j < 4; j++)\n\t\t{\n\t\t\tSpawnCrate(junkCratePrefab.resourcePath);\n\t\t}\n\t\tlootRoundsPassed++;\n\t\tif (lootRoundsPassed >= loot_rounds)\n\t\t{\n\t\t\tCancelInvoke(RespawnLoot);\n\t\t}\n\t}\n}\n",
      "ParametersText": "CargoShip cargoShip",
      "TargetName": "CargoShip",
      "MethodName": "RespawnLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4156200225,
      "Name": "OnCargoShipHarborApproach",
      "FullName": "OnCargoShipHarborApproach",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cargoShip",
          "typeName": "CargoShip",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cargo ship harbor approach occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartHarborApproach(CargoNotifier cn)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnCargoShipHarborApproach\", this, cn) != null)\n\t{\n\t\treturn;\n\t}\n\tPlayHorn();\n\tisDoingHarborApproach = true;\n\tdockCount++;\n\tshouldLookAhead = false;\n\tif (proxManager != null)\n\t{\n\t\tproxManager.StartMovement();\n\t}\n\tClearAllHarborEntitiesOnShip();\n\tforeach (HarborCraneContainerPickup allCrane in HarborCraneContainerPickup.AllCranes)\n\t{\n\t\tif (!(allCrane == null) && !allCrane.isClient && !(allCrane.Distance2D(harborApproachPath.nodes[harborApproachPath.nodes.Count / 2].Position) > 150f))\n\t\t{\n\t\t\tallCrane.ReplenishContainers();\n\t\t}\n\t}\n}\n",
      "ParametersText": "CargoShip cargoShip",
      "TargetName": "CargoShip",
      "MethodName": "StartHarborApproach",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3543067996,
      "Name": "OnCargoShipHarborArrived",
      "FullName": "OnCargoShipHarborArrived",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cargoShip",
          "typeName": "CargoShip",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a cargo ship harbor is arrived."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnArrivedAtHarbor()\n{\n\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\tSystem.Collections.Generic.List<UnityEngine.Transform> obj = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.Transform>>();\n\tfloat num = UnityEngine.Random.Range(dock_time * 0.05f, dock_time * 0.1f);\n\tforeach (HarborCraneContainerPickup allCrane in HarborCraneContainerPickup.AllCranes)\n\t{\n\t\tif (allCrane == null || allCrane.isClient || allCrane.Distance2D(this) > 150f)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tobj.Clear();\n\t\tCargoShipContainerDestination[] array = containerDestinations;\n\t\tforeach (CargoShipContainerDestination cargoShipContainerDestination in array)\n\t\t{\n\t\t\tif (allCrane.IsDestinationValidForCrane(cargoShipContainerDestination))\n\t\t\t{\n\t\t\t\tobj.Add(cargoShipContainerDestination.transform);\n\t\t\t}\n\t\t}\n\t\tif (obj.Count > 0)\n\t\t{\n\t\t\tallCrane.AssignDestination(obj, this, num);\n\t\t\tnum += dock_time * UnityEngine.Random.Range(0.1f, 0.15f);\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\tInvoke(PreHarborLeaveHorn, dock_time - 60f);\n\tif (refresh_loot_on_dock)\n\t{\n\t\tRespawnLoot();\n\t}\n\tif (harborIndex == 0)\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved3, b: true);\n\t}\n\telse if (harborIndex == 1)\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved4, b: true);\n\t}\n\tInvoke(LeaveHarbor, dock_time);\n\tOxide.Core.Interface.CallHook(\"OnCargoShipHarborArrived\", this);\n}\n",
      "ParametersText": "CargoShip cargoShip",
      "TargetName": "CargoShip",
      "MethodName": "OnArrivedAtHarbor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2869903233,
      "Name": "OnCargoShipHarborLeave",
      "FullName": "OnCargoShipHarborLeave",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "cargoShip",
          "typeName": "CargoShip",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a cargo ship harbor leaves."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void LeaveHarbor()\n{\n\tif (docking_debug)\n\t{\n\t\tUnityEngine.Debug.Log(\"Cargo is leaving harbor.\");\n\t}\n\tPlayHorn();\n\tSetFlag(BaseEntity.Flags.Reserved1, b: false);\n\tSetFlag(BaseEntity.Flags.Reserved2, b: true);\n\tcurrentHarborApproachNode++;\n\tOxide.Core.Interface.CallHook(\"OnCargoShipHarborLeave\", this);\n}\n",
      "ParametersText": "CargoShip cargoShip",
      "TargetName": "CargoShip",
      "MethodName": "LeaveHarbor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 430051754,
      "Name": "OnEntityDestroy",
      "FullName": "OnEntityDestroy [BradleyAPC]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is destroyed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnDied(HitInfo info)\n{\n\tif (base.isClient || Oxide.Core.Interface.CallHook(\"OnEntityDestroy\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tCreateExplosionMarker(10f);\n\tEffect.server.Run(explosionEffect.resourcePath, mainTurretEyePos.transform.position, UnityEngine.Vector3.up, null, broadcast: true);\n\tUnityEngine.Vector3 zero = UnityEngine.Vector3.zero;\n\tUnityEngine.GameObject gibSource = servergibs.Get().GetComponent<ServerGib>()._gibSource;\n\tSystem.Collections.Generic.List<ServerGib> list = ServerGib.CreateGibs(servergibs.resourcePath, base.gameObject, gibSource, zero, 3f);\n\tfor (int i = 0; i < 12 - maxCratesToSpawn; i++)\n\t{\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(this.fireBall.resourcePath, base.transform.position, base.transform.rotation);\n\t\tif (!baseEntity)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tfloat minInclusive = 3f;\n\t\tfloat maxInclusive = 10f;\n\t\tUnityEngine.Vector3 onUnitSphere = UnityEngine.Random.onUnitSphere;\n\t\tbaseEntity.transform.position = base.transform.position + new UnityEngine.Vector3(0f, 1.5f, 0f) + onUnitSphere * UnityEngine.Random.Range(-4f, 4f);\n\t\tUnityEngine.Collider component = baseEntity.GetComponent<UnityEngine.Collider>();\n\t\tbaseEntity.Spawn();\n\t\tbaseEntity.SetVelocity(zero + onUnitSphere * UnityEngine.Random.Range(minInclusive, maxInclusive));\n\t\tforeach (ServerGib item in list)\n\t\t{\n\t\t\tUnityEngine.Physics.IgnoreCollision(component, item.GetCollider(), ignore: true);\n\t\t}\n\t}\n\tfor (int j = 0; j < maxCratesToSpawn; j++)\n\t{\n\t\tUnityEngine.Vector3 onUnitSphere2 = UnityEngine.Random.onUnitSphere;\n\t\tonUnitSphere2.y = 0f;\n\t\tonUnitSphere2.Normalize();\n\t\tUnityEngine.Vector3 pos = base.transform.position + new UnityEngine.Vector3(0f, 1.5f, 0f) + onUnitSphere2 * UnityEngine.Random.Range(2f, 3f);\n\t\tBaseEntity baseEntity2 = GameManager.server.CreateEntity(crateToDrop.resourcePath, pos, UnityEngine.Quaternion.LookRotation(onUnitSphere2));\n\t\tbaseEntity2.Spawn();\n\t\tLootContainer lootContainer = baseEntity2 as LootContainer;\n\t\tif ((bool)lootContainer)\n\t\t{\n\t\t\tlootContainer.Invoke(lootContainer.RemoveMe, 1800f);\n\t\t}\n\t\tUnityEngine.Collider component2 = baseEntity2.GetComponent<UnityEngine.Collider>();\n\t\tUnityEngine.Rigidbody rigidbody = baseEntity2.gameObject.AddComponent<UnityEngine.Rigidbody>();\n\t\trigidbody.useGravity = true;\n\t\trigidbody.collisionDetectionMode = UnityEngine.CollisionDetectionMode.ContinuousDynamic;\n\t\trigidbody.mass = 2f;\n\t\trigidbody.interpolation = UnityEngine.RigidbodyInterpolation.Interpolate;\n\t\trigidbody.velocity = zero + onUnitSphere2 * UnityEngine.Random.Range(1f, 3f);\n\t\trigidbody.angularVelocity = UnityEngine.Vector3Ex.Range(-1.75f, 1.75f);\n\t\trigidbody.drag = 0.5f * (rigidbody.mass / 5f);\n\t\trigidbody.angularDrag = 0.2f * (rigidbody.mass / 5f);\n\t\tFireBall fireBall = GameManager.server.CreateEntity(this.fireBall.resourcePath) as FireBall;\n\t\tif ((bool)fireBall)\n\t\t{\n\t\t\tfireBall.SetParent(baseEntity2);\n\t\t\tfireBall.Spawn();\n\t\t\tfireBall.GetComponent<UnityEngine.Rigidbody>().isKinematic = true;\n\t\t\tfireBall.GetComponent<UnityEngine.Collider>().enabled = false;\n\t\t}\n\t\tbaseEntity2.SendMessage(\"SetLockingEnt\", fireBall.gameObject, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tforeach (ServerGib item2 in list)\n\t\t{\n\t\t\tUnityEngine.Physics.IgnoreCollision(component2, item2.GetCollider(), ignore: true);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnCrateSpawned\", this, baseEntity2);\n\t}\n\tKillSpawnedScientists();\n\tif (info != null && info.InitiatorPlayer != null && info.InitiatorPlayer.serverClan != null)\n\t{\n\t\tinfo.InitiatorPlayer.AddClanScore(ClanScoreEventType.DestroyedBradley);\n\t}\n\tbase.OnDied(info);\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "OnDied",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2131038016,
      "Name": "OnCrateSpawned",
      "FullName": "OnCrateSpawned [BradleyAPC]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        },
        {
          "name": "local14",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a crate is spawned.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnDied(HitInfo info)\n{\n\tif (base.isClient || Oxide.Core.Interface.CallHook(\"OnEntityDestroy\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tCreateExplosionMarker(10f);\n\tEffect.server.Run(explosionEffect.resourcePath, mainTurretEyePos.transform.position, UnityEngine.Vector3.up, null, broadcast: true);\n\tUnityEngine.Vector3 zero = UnityEngine.Vector3.zero;\n\tUnityEngine.GameObject gibSource = servergibs.Get().GetComponent<ServerGib>()._gibSource;\n\tSystem.Collections.Generic.List<ServerGib> list = ServerGib.CreateGibs(servergibs.resourcePath, base.gameObject, gibSource, zero, 3f);\n\tfor (int i = 0; i < 12 - maxCratesToSpawn; i++)\n\t{\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(this.fireBall.resourcePath, base.transform.position, base.transform.rotation);\n\t\tif (!baseEntity)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tfloat minInclusive = 3f;\n\t\tfloat maxInclusive = 10f;\n\t\tUnityEngine.Vector3 onUnitSphere = UnityEngine.Random.onUnitSphere;\n\t\tbaseEntity.transform.position = base.transform.position + new UnityEngine.Vector3(0f, 1.5f, 0f) + onUnitSphere * UnityEngine.Random.Range(-4f, 4f);\n\t\tUnityEngine.Collider component = baseEntity.GetComponent<UnityEngine.Collider>();\n\t\tbaseEntity.Spawn();\n\t\tbaseEntity.SetVelocity(zero + onUnitSphere * UnityEngine.Random.Range(minInclusive, maxInclusive));\n\t\tforeach (ServerGib item in list)\n\t\t{\n\t\t\tUnityEngine.Physics.IgnoreCollision(component, item.GetCollider(), ignore: true);\n\t\t}\n\t}\n\tfor (int j = 0; j < maxCratesToSpawn; j++)\n\t{\n\t\tUnityEngine.Vector3 onUnitSphere2 = UnityEngine.Random.onUnitSphere;\n\t\tonUnitSphere2.y = 0f;\n\t\tonUnitSphere2.Normalize();\n\t\tUnityEngine.Vector3 pos = base.transform.position + new UnityEngine.Vector3(0f, 1.5f, 0f) + onUnitSphere2 * UnityEngine.Random.Range(2f, 3f);\n\t\tBaseEntity baseEntity2 = GameManager.server.CreateEntity(crateToDrop.resourcePath, pos, UnityEngine.Quaternion.LookRotation(onUnitSphere2));\n\t\tbaseEntity2.Spawn();\n\t\tLootContainer lootContainer = baseEntity2 as LootContainer;\n\t\tif ((bool)lootContainer)\n\t\t{\n\t\t\tlootContainer.Invoke(lootContainer.RemoveMe, 1800f);\n\t\t}\n\t\tUnityEngine.Collider component2 = baseEntity2.GetComponent<UnityEngine.Collider>();\n\t\tUnityEngine.Rigidbody rigidbody = baseEntity2.gameObject.AddComponent<UnityEngine.Rigidbody>();\n\t\trigidbody.useGravity = true;\n\t\trigidbody.collisionDetectionMode = UnityEngine.CollisionDetectionMode.ContinuousDynamic;\n\t\trigidbody.mass = 2f;\n\t\trigidbody.interpolation = UnityEngine.RigidbodyInterpolation.Interpolate;\n\t\trigidbody.velocity = zero + onUnitSphere2 * UnityEngine.Random.Range(1f, 3f);\n\t\trigidbody.angularVelocity = UnityEngine.Vector3Ex.Range(-1.75f, 1.75f);\n\t\trigidbody.drag = 0.5f * (rigidbody.mass / 5f);\n\t\trigidbody.angularDrag = 0.2f * (rigidbody.mass / 5f);\n\t\tFireBall fireBall = GameManager.server.CreateEntity(this.fireBall.resourcePath) as FireBall;\n\t\tif ((bool)fireBall)\n\t\t{\n\t\t\tfireBall.SetParent(baseEntity2);\n\t\t\tfireBall.Spawn();\n\t\t\tfireBall.GetComponent<UnityEngine.Rigidbody>().isKinematic = true;\n\t\t\tfireBall.GetComponent<UnityEngine.Collider>().enabled = false;\n\t\t}\n\t\tbaseEntity2.SendMessage(\"SetLockingEnt\", fireBall.gameObject, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tforeach (ServerGib item2 in list)\n\t\t{\n\t\t\tUnityEngine.Physics.IgnoreCollision(component2, item2.GetCollider(), ignore: true);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnCrateSpawned\", this, baseEntity2);\n\t}\n\tKillSpawnedScientists();\n\tif (info != null && info.InitiatorPlayer != null && info.InitiatorPlayer.serverClan != null)\n\t{\n\t\tinfo.InitiatorPlayer.AddClanScore(ClanScoreEventType.DestroyedBradley);\n\t}\n\tbase.OnDied(info);\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC, BaseEntity local14",
      "TargetName": "BradleyAPC",
      "MethodName": "OnDied",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4040320602,
      "Name": "OnSwitchToggle",
      "FullName": "OnSwitchToggle [FuelGenerator]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "fuelGenerator",
          "typeName": "FuelGenerator",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a switch toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_EngineSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnSwitchToggle\", this, msg.player) == null)\n\t{\n\t\tbool generatorState = msg.read.Bit();\n\t\tSetGeneratorState(generatorState);\n\t\tOxide.Core.Interface.CallHook(\"OnSwitchToggled\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "FuelGenerator fuelGenerator, BasePlayer player",
      "TargetName": "FuelGenerator",
      "MethodName": "RPC_EngineSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 588890708,
      "Name": "OnSwitchToggled",
      "FullName": "OnSwitchToggled [FuelGenerator]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "fuelGenerator",
          "typeName": "FuelGenerator",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a switch toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_EngineSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnSwitchToggle\", this, msg.player) == null)\n\t{\n\t\tbool generatorState = msg.read.Bit();\n\t\tSetGeneratorState(generatorState);\n\t\tOxide.Core.Interface.CallHook(\"OnSwitchToggled\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "FuelGenerator fuelGenerator, BasePlayer player",
      "TargetName": "FuelGenerator",
      "MethodName": "RPC_EngineSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1561104099,
      "Name": "OnEntityActiveCheck",
      "FullName": "OnEntityActiveCheck",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "ent",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "id",
          "typeName": "System.UInt32",
          "optional": false
        },
        {
          "name": "debugName",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity active check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "BaseEntity ent, BasePlayer player, uint id, string debugName",
      "TargetName": "BaseEntity/RPC_Server/IsActiveItem",
      "MethodName": "Test",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3998151491,
      "Name": "OnEntityFromOwnerCheck",
      "FullName": "OnEntityFromOwnerCheck",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "ent",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "id",
          "typeName": "System.UInt32",
          "optional": false
        },
        {
          "name": "debugName",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity from owner check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "BaseEntity ent, BasePlayer player, uint id, string debugName",
      "TargetName": "BaseEntity/RPC_Server/FromOwner",
      "MethodName": "Test",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3141188509,
      "Name": "OnEntityVisibilityCheck",
      "FullName": "OnEntityVisibilityCheck",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "ent",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "id",
          "typeName": "System.UInt32",
          "optional": false
        },
        {
          "name": "debugName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "maximumDistance",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity visibility check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "BaseEntity ent, BasePlayer player, uint id, string debugName, float maximumDistance",
      "TargetName": "BaseEntity/RPC_Server/IsVisible",
      "MethodName": "Test",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1582967250,
      "Name": "OnEntityDistanceCheck",
      "FullName": "OnEntityDistanceCheck",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "ent",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "id",
          "typeName": "System.UInt32",
          "optional": false
        },
        {
          "name": "debugName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "maximumDistance",
          "typeName": "System.Single",
          "optional": false
        },
        {
          "name": "checkParent",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity distance check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "BaseEntity ent, BasePlayer player, uint id, string debugName, float maximumDistance, bool checkParent",
      "TargetName": "BaseEntity/RPC_Server/MaxDistance",
      "MethodName": "Test",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1147855574,
      "Name": "OnStashHidden",
      "FullName": "OnStashHidden",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "stashContainer",
          "typeName": "StashContainer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when stash hidden occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_HideStash(BaseEntity.RPCMessage rpc)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanHideStash\", rpc.player, this) == null)\n\t{\n\t\tFacepunch.Rust.Analytics.Azure.OnStashHidden(rpc.player, this);\n\t\tSetHidden(isHidden: true);\n\t\tOxide.Core.Interface.CallHook(\"OnStashHidden\", this, rpc.player);\n\t}\n}\n",
      "ParametersText": "StashContainer stashContainer, BasePlayer player",
      "TargetName": "StashContainer",
      "MethodName": "RPC_HideStash",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4230146336,
      "Name": "OnStashOcclude",
      "FullName": "OnStashOcclude",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "stashContainer",
          "typeName": "StashContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when stash occlude occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoOccludedCheck()\n{\n\tif (UnityEngine.Physics.SphereCast(new UnityEngine.Ray(base.transform.position + UnityEngine.Vector3.up * 5f, UnityEngine.Vector3.down), 0.25f, 5f, 2097152) && Oxide.Core.Interface.CallHook(\"OnStashOcclude\", this) == null)\n\t{\n\t\tDropItems();\n\t\tKill();\n\t}\n}\n",
      "ParametersText": "StashContainer stashContainer",
      "TargetName": "StashContainer",
      "MethodName": "DoOccludedCheck",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1519034006,
      "Name": "OnMixingTableToggle",
      "FullName": "OnMixingTableToggle",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "mixingTable",
          "typeName": "MixingTable",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mixing table toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void SVSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnMixingTableToggle\", this, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = msg.read.Bit();\n\tif (flag != IsOn() && !(msg.player == null))\n\t{\n\t\tif (flag)\n\t\t{\n\t\t\tStartMixing(msg.player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tStopMixing();\n\t\t}\n\t}\n}\n",
      "ParametersText": "MixingTable mixingTable, BasePlayer player",
      "TargetName": "MixingTable",
      "MethodName": "SVSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 224409329,
      "Name": "OnMixingTableFinished",
      "FullName": "OnMixingTableFinished",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "mixingTable",
          "typeName": "MixingTable",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "MixingTable",
          "optional": false
        },
        {
          "name": "recipe",
          "typeName": "Recipe",
          "optional": false
        },
        {
          "name": "quantity",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mixing table finishes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ProduceItem(Recipe recipe, int quantity)\n{\n\tpendingItemId = recipe.ProducedItem.itemid;\n\tStopMixing();\n\tConsumeInventory(recipe, quantity);\n\tCreateRecipeItems(recipe, quantity);\n\tOxide.Core.Interface.CallHook(\"OnMixingTableFinished\", this, MixStartingPlayer, recipe, quantity);\n}\n",
      "ParametersText": "MixingTable mixingTable, MixingTable self1, Recipe recipe, int quantity",
      "TargetName": "MixingTable",
      "MethodName": "ProduceItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1768944892,
      "Name": "OnSleepingBagDestroyed",
      "FullName": "OnSleepingBagDestroyed",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "SleepingBag",
          "optional": false
        },
        {
          "name": "userID",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sleeping bag is destroyed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool DestroyBag(ulong userID, NetworkableId sleepingBag)\n{\n\tbool result;\n\tusing (PooledList<SleepingBag> pooledList = FindForPlayer(userID))\n\t{\n\t\tSleepingBag sleepingBag2 = null;\n\t\tforeach (SleepingBag item in pooledList)\n\t\t{\n\t\t\tif (item.net.ID == sleepingBag)\n\t\t\t{\n\t\t\t\tsleepingBag2 = item;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (sleepingBag2 == null)\n\t\t{\n\t\t\tresult = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnSleepingBagDestroy\", sleepingBag2, userID) != null)\n\t\t\t{\n\t\t\t\tresult = false;\n\t\t\t\t/*Error near IL_0077: Could not find block for branch target IL_00e8*/;\n\t\t\t}\n\t\t\tRemoveBagForPlayer(sleepingBag2, sleepingBag2.deployerUserID);\n\t\t\tsleepingBag2.deployerUserID = 0uL;\n\t\t\tif (sleepingBag2.HasFlag(BaseEntity.Flags.Reserved14))\n\t\t\t{\n\t\t\t\tsleepingBag2.Kill();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsleepingBag2.SendNetworkUpdate();\n\t\t\t}\n\t\t\tBasePlayer basePlayer = BasePlayer.FindByID(userID);\n\t\t\tif (basePlayer != null)\n\t\t\t{\n\t\t\t\tbasePlayer.SendRespawnOptions();\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnSleepingBagDestroyed\", sleepingBag2, userID);\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnBagUnclaimed(basePlayer, sleepingBag2);\n\t\t\t}\n\t\t\tresult = true;\n\t\t}\n\t}\n\treturn result;\n}\n",
      "ParametersText": "SleepingBag local1, ulong userID",
      "TargetName": "SleepingBag",
      "MethodName": "DestroyBag",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3482402992,
      "Name": "OnSleepingBagValidCheck",
      "FullName": "OnSleepingBagValidCheck",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "sleepingBag",
          "typeName": "SleepingBag",
          "optional": false
        },
        {
          "name": "playerID",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "ignoreTimers",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when sleeping bag valid check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool ValidForPlayer(ulong playerID, bool ignoreTimers)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnSleepingBagValidCheck\", this, playerID, ignoreTimers);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (deployerUserID == playerID)\n\t{\n\t\tif (!ignoreTimers)\n\t\t{\n\t\t\treturn unlockTime < UnityEngine.Time.realtimeSinceStartup;\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "SleepingBag sleepingBag, ulong playerID, bool ignoreTimers",
      "TargetName": "SleepingBag",
      "MethodName": "ValidForPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2728328530,
      "Name": "OnBedMade",
      "FullName": "OnBedMade",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "sleepingBag",
          "typeName": "SleepingBag",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bed made occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_MakeBed(BaseEntity.RPCMessage msg)\n{\n\tif (!canBePublic || !IsPublic() || !msg.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tif (ConVar.Server.max_sleeping_bags > 0)\n\t{\n\t\tSleepingBag.CanAssignBedResult? canAssignBedResult = CanAssignBed(msg.player, this, msg.player.userID, 1, 0, this);\n\t\tif (canAssignBedResult.HasValue)\n\t\t{\n\t\t\tif (canAssignBedResult.Value.Result != 0)\n\t\t\t{\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Red_Normal, cannotMakeBedPhrase, false);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Long, bagLimitPhrase, false, canAssignBedResult.Value.Count.ToString(), canAssignBedResult.Value.Max.ToString());\n\t\t\t}\n\t\t\tif (canAssignBedResult.Value.Result != 0)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tulong num = deployerUserID;\n\tdeployerUserID = msg.player.userID;\n\tOnBagChangedOwnership(this, num);\n\tNotifyPlayer(num);\n\tNotifyPlayer(deployerUserID);\n\tOxide.Core.Interface.CallHook(\"OnBedMade\", this, msg.player);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "SleepingBag sleepingBag, BasePlayer player",
      "TargetName": "SleepingBag",
      "MethodName": "RPC_MakeBed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 604831830,
      "Name": "OnSleepingBagDestroy",
      "FullName": "OnSleepingBagDestroy",
      "Category": "Entity",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool DestroyBag(ulong userID, NetworkableId sleepingBag)\n{\n\tbool result;\n\tusing (PooledList<SleepingBag> pooledList = FindForPlayer(userID))\n\t{\n\t\tSleepingBag sleepingBag2 = null;\n\t\tforeach (SleepingBag item in pooledList)\n\t\t{\n\t\t\tif (item.net.ID == sleepingBag)\n\t\t\t{\n\t\t\t\tsleepingBag2 = item;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (sleepingBag2 == null)\n\t\t{\n\t\t\tresult = false;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnSleepingBagDestroy\", sleepingBag2, userID) != null)\n\t\t\t{\n\t\t\t\tresult = false;\n\t\t\t\t/*Error near IL_0077: Could not find block for branch target IL_00e8*/;\n\t\t\t}\n\t\t\tRemoveBagForPlayer(sleepingBag2, sleepingBag2.deployerUserID);\n\t\t\tsleepingBag2.deployerUserID = 0uL;\n\t\t\tif (sleepingBag2.HasFlag(BaseEntity.Flags.Reserved14))\n\t\t\t{\n\t\t\t\tsleepingBag2.Kill();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tsleepingBag2.SendNetworkUpdate();\n\t\t\t}\n\t\t\tBasePlayer basePlayer = BasePlayer.FindByID(userID);\n\t\t\tif (basePlayer != null)\n\t\t\t{\n\t\t\t\tbasePlayer.SendRespawnOptions();\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnSleepingBagDestroyed\", sleepingBag2, userID);\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnBagUnclaimed(basePlayer, sleepingBag2);\n\t\t\t}\n\t\t\tresult = true;\n\t\t}\n\t}\n\treturn result;\n}\n",
      "ParametersText": "",
      "TargetName": "SleepingBag",
      "MethodName": "DestroyBag",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 283407006,
      "Name": "OnAnalysisComplete",
      "FullName": "OnAnalysisComplete",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "surveyCrater",
          "typeName": "SurveyCrater",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when analysis complete occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void AnalysisComplete(BaseEntity.RPCMessage msg)\n{\n\tOxide.Core.Interface.CallHook(\"OnAnalysisComplete\", this, msg.player);\n}\n",
      "ParametersText": "SurveyCrater surveyCrater, BasePlayer player",
      "TargetName": "SurveyCrater",
      "MethodName": "AnalysisComplete",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3303516810,
      "Name": "OnHotAirBalloonToggle",
      "FullName": "OnHotAirBalloonToggle",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hotAirBalloon",
          "typeName": "HotAirBalloon",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a hot AIr balloon toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void EngineSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHotAirBalloonToggle\", this, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && (!OnlyOwnerAccessible() || !(player != creatorEntity)))\n\t{\n\t\tbool b = msg.read.Bit();\n\t\tSetFlag(BaseEntity.Flags.On, b);\n\t\tif (IsOn())\n\t\t{\n\t\t\tInvoke(ScheduleOff, 60f);\n\t\t\tOxide.Core.Interface.CallHook(\"OnHotAirBalloonToggled\", this, msg.player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCancelInvoke(ScheduleOff);\n\t\t\tOxide.Core.Interface.CallHook(\"OnHotAirBalloonToggled\", this, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "HotAirBalloon hotAirBalloon, BasePlayer player",
      "TargetName": "HotAirBalloon",
      "MethodName": "EngineSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2344157017,
      "Name": "OnHotAirBalloonToggled",
      "FullName": "OnHotAirBalloonToggled [on]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hotAirBalloon",
          "typeName": "HotAirBalloon",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a hot AIr balloon toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void EngineSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHotAirBalloonToggle\", this, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && (!OnlyOwnerAccessible() || !(player != creatorEntity)))\n\t{\n\t\tbool b = msg.read.Bit();\n\t\tSetFlag(BaseEntity.Flags.On, b);\n\t\tif (IsOn())\n\t\t{\n\t\t\tInvoke(ScheduleOff, 60f);\n\t\t\tOxide.Core.Interface.CallHook(\"OnHotAirBalloonToggled\", this, msg.player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCancelInvoke(ScheduleOff);\n\t\t\tOxide.Core.Interface.CallHook(\"OnHotAirBalloonToggled\", this, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "HotAirBalloon hotAirBalloon, BasePlayer player",
      "TargetName": "HotAirBalloon",
      "MethodName": "EngineSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2344157017,
      "Name": "OnHotAirBalloonToggled",
      "FullName": "OnHotAirBalloonToggled [off]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "hotAirBalloon",
          "typeName": "HotAirBalloon",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a hot AIr balloon toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void EngineSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHotAirBalloonToggle\", this, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && (!OnlyOwnerAccessible() || !(player != creatorEntity)))\n\t{\n\t\tbool b = msg.read.Bit();\n\t\tSetFlag(BaseEntity.Flags.On, b);\n\t\tif (IsOn())\n\t\t{\n\t\t\tInvoke(ScheduleOff, 60f);\n\t\t\tOxide.Core.Interface.CallHook(\"OnHotAirBalloonToggled\", this, msg.player);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tCancelInvoke(ScheduleOff);\n\t\t\tOxide.Core.Interface.CallHook(\"OnHotAirBalloonToggled\", this, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "HotAirBalloon hotAirBalloon, BasePlayer player",
      "TargetName": "HotAirBalloon",
      "MethodName": "EngineSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2490095392,
      "Name": "OnReactiveTargetReset",
      "FullName": "OnReactiveTargetReset",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "reactiveTarget",
          "typeName": "ReactiveTarget",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when reactive target reset occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ResetTarget()\n{\n\tif (IsLowered() && CanToggle() && CanReset())\n\t{\n\t\tCancelInvoke(ResetTarget);\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tSetFlag(BaseEntity.Flags.Reserved1, b: false);\n\t\tknockdownHealth = 100f;\n\t\tSendPowerBurst();\n\t\tOxide.Core.Interface.CallHook(\"OnReactiveTargetReset\", this);\n\t}\n}\n",
      "ParametersText": "ReactiveTarget reactiveTarget",
      "TargetName": "ReactiveTarget",
      "MethodName": "ResetTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1350371272,
      "Name": "OnCargoPlaneSignaled",
      "FullName": "OnCargoPlaneSignaled",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "supplySignal",
          "typeName": "SupplySignal",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a cargo plane is signaled."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Explode()\n{\n\tBaseEntity baseEntity = GameManager.server.CreateEntity(EntityToCreate.resourcePath);\n\tif ((bool)baseEntity)\n\t{\n\t\tUnityEngine.Vector3 vector = new UnityEngine.Vector3(UnityEngine.Random.Range(-20f, 20f), 0f, UnityEngine.Random.Range(-20f, 20f));\n\t\tbaseEntity.SendMessage(\"InitDropPosition\", base.transform.position + vector, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tbaseEntity.Spawn();\n\t\tOxide.Core.Interface.CallHook(\"OnCargoPlaneSignaled\", baseEntity, this);\n\t}\n\tInvoke(FinishUp, 210f);\n\tSetFlag(BaseEntity.Flags.On, b: true);\n\tSendNetworkUpdateImmediate();\n}\n",
      "ParametersText": "BaseEntity local0, SupplySignal supplySignal",
      "TargetName": "SupplySignal",
      "MethodName": "Explode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2010102072,
      "Name": "OnWaterPurify",
      "FullName": "OnWaterPurify",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "waterPurifier",
          "typeName": "WaterPurifier",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when water purify occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected void ConvertWater(float timeCooked)\n{\n\tItem slot = purifiedWaterStorage.inventory.GetSlot(0);\n\tif ((stopWhenOutputFull && slot != null && slot.amount >= slot.MaxStackable()) || Oxide.Core.Interface.CallHook(\"OnWaterPurify\", this, timeCooked) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = timeCooked * ((float)waterToProcessPerMinute / 60f);\n\tif (slot != null)\n\t{\n\t\tfloat num2 = UnityEngine.Mathf.Max(slot.MaxStackable() - slot.amount, 0);\n\t\tnum = UnityEngine.Mathf.Min(num, num2 * (float)freshWaterRatio);\n\t}\n\tdirtyWaterProcssed += num;\n\tif (dirtyWaterProcssed >= 1f)\n\t{\n\t\tItem slot2 = base.inventory.GetSlot(0);\n\t\tint num3 = UnityEngine.Mathf.Min(UnityEngine.Mathf.FloorToInt(dirtyWaterProcssed), slot2.amount);\n\t\tnum = num3;\n\t\tslot2.UseItem(num3);\n\t\tdirtyWaterProcssed -= num3;\n\t\tSendNetworkUpdate();\n\t}\n\tpendingFreshWater += num / (float)freshWaterRatio;\n\tif (!(pendingFreshWater >= 1f))\n\t{\n\t\treturn;\n\t}\n\tint num4 = UnityEngine.Mathf.FloorToInt(pendingFreshWater);\n\tpendingFreshWater -= num4;\n\tItem slot3 = purifiedWaterStorage.inventory.GetSlot(0);\n\tif (slot3 != null && slot3.info != freshWater)\n\t{\n\t\tslot3.RemoveFromContainer();\n\t\tslot3.Remove();\n\t}\n\tif (slot3 == null)\n\t{\n\t\tItem item = ItemManager.Create(freshWater, num4, 0uL);\n\t\tif (!item.MoveToContainer(purifiedWaterStorage.inventory))\n\t\t{\n\t\t\titem.Remove();\n\t\t}\n\t}\n\telse\n\t{\n\t\tslot3.amount += num4;\n\t\tslot3.amount = UnityEngine.Mathf.Clamp(slot3.amount, 0, purifiedWaterStorage.maxStackSize);\n\t\tpurifiedWaterStorage.inventory.MarkDirty();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnWaterPurified\", this, timeCooked);\n\tpurifiedWaterStorage.SendNetworkUpdate();\n}\n",
      "ParametersText": "WaterPurifier waterPurifier",
      "TargetName": "WaterPurifier",
      "MethodName": "ConvertWater",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2355220321,
      "Name": "OnWaterPurified",
      "FullName": "OnWaterPurified",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "waterPurifier",
          "typeName": "WaterPurifier",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a water is purified."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected void ConvertWater(float timeCooked)\n{\n\tItem slot = purifiedWaterStorage.inventory.GetSlot(0);\n\tif ((stopWhenOutputFull && slot != null && slot.amount >= slot.MaxStackable()) || Oxide.Core.Interface.CallHook(\"OnWaterPurify\", this, timeCooked) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = timeCooked * ((float)waterToProcessPerMinute / 60f);\n\tif (slot != null)\n\t{\n\t\tfloat num2 = UnityEngine.Mathf.Max(slot.MaxStackable() - slot.amount, 0);\n\t\tnum = UnityEngine.Mathf.Min(num, num2 * (float)freshWaterRatio);\n\t}\n\tdirtyWaterProcssed += num;\n\tif (dirtyWaterProcssed >= 1f)\n\t{\n\t\tItem slot2 = base.inventory.GetSlot(0);\n\t\tint num3 = UnityEngine.Mathf.Min(UnityEngine.Mathf.FloorToInt(dirtyWaterProcssed), slot2.amount);\n\t\tnum = num3;\n\t\tslot2.UseItem(num3);\n\t\tdirtyWaterProcssed -= num3;\n\t\tSendNetworkUpdate();\n\t}\n\tpendingFreshWater += num / (float)freshWaterRatio;\n\tif (!(pendingFreshWater >= 1f))\n\t{\n\t\treturn;\n\t}\n\tint num4 = UnityEngine.Mathf.FloorToInt(pendingFreshWater);\n\tpendingFreshWater -= num4;\n\tItem slot3 = purifiedWaterStorage.inventory.GetSlot(0);\n\tif (slot3 != null && slot3.info != freshWater)\n\t{\n\t\tslot3.RemoveFromContainer();\n\t\tslot3.Remove();\n\t}\n\tif (slot3 == null)\n\t{\n\t\tItem item = ItemManager.Create(freshWater, num4, 0uL);\n\t\tif (!item.MoveToContainer(purifiedWaterStorage.inventory))\n\t\t{\n\t\t\titem.Remove();\n\t\t}\n\t}\n\telse\n\t{\n\t\tslot3.amount += num4;\n\t\tslot3.amount = UnityEngine.Mathf.Clamp(slot3.amount, 0, purifiedWaterStorage.maxStackSize);\n\t\tpurifiedWaterStorage.inventory.MarkDirty();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnWaterPurified\", this, timeCooked);\n\tpurifiedWaterStorage.SendNetworkUpdate();\n}\n",
      "ParametersText": "WaterPurifier waterPurifier",
      "TargetName": "WaterPurifier",
      "MethodName": "ConvertWater",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 318355959,
      "Name": "OnWaterCollect",
      "FullName": "OnWaterCollect [WaterCatcher]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "waterCatcher",
          "typeName": "WaterCatcher",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when water collect occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void CollectWater()\n{\n\tif (base.inventory != null && !IsFull() && Oxide.Core.Interface.CallHook(\"OnWaterCollect\", this) == null)\n\t{\n\t\tfloat baseRate = collectionRates.baseRate;\n\t\tbaseRate += Climate.GetFog(base.transform.position) * collectionRates.fogRate;\n\t\tif (TestIsOutside(base.transform, rainTestPosition, rainTestSize, 256f))\n\t\t{\n\t\t\tbaseRate += Climate.GetRain(base.transform.position) * collectionRates.rainRate;\n\t\t\tbaseRate += Climate.GetSnow(base.transform.position) * collectionRates.snowRate;\n\t\t}\n\t\tAddResource(UnityEngine.Mathf.CeilToInt(maxItemToCreate * baseRate));\n\t}\n}\n",
      "ParametersText": "WaterCatcher waterCatcher",
      "TargetName": "WaterCatcher",
      "MethodName": "CollectWater",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2929038092,
      "Name": "OnLiquidVesselFill",
      "FullName": "OnLiquidVesselFill",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "baseLiquidVessel",
          "typeName": "BaseLiquidVessel",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "LiquidContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a liquid vessel is filled."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FillCheck()\n{\n\tif (base.isClient)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn;\n\t}\n\tfloat f = (UnityEngine.Time.realtimeSinceStartup - lastFillTime) * fillMlPerSec;\n\tUnityEngine.Vector3 pos = ownerPlayer.transform.position - new UnityEngine.Vector3(0f, 1f, 0f);\n\tLiquidContainer facingLiquidContainer = GetFacingLiquidContainer();\n\tif (Oxide.Core.Interface.CallHook(\"OnLiquidVesselFill\", this, ownerPlayer, facingLiquidContainer) != null)\n\t{\n\t\treturn;\n\t}\n\tif (facingLiquidContainer == null && CanFillFromWorld())\n\t{\n\t\tItem contents = GetContents();\n\t\tItemDefinition itemDefinition = WaterResource.SV_GetAtPoint(pos);\n\t\tif (contents != null && contents.info.itemid != itemDefinition.itemid)\n\t\t{\n\t\t\tif ((float)timeSinceLastToast > 5f)\n\t\t\t{\n\t\t\t\ttimeSinceLastToast = 0f;\n\t\t\t\townerPlayer.ShowToast(GameTip.Styles.Red_Normal, DifferentLiquidType, false);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tAddLiquid(itemDefinition, UnityEngine.Mathf.FloorToInt(f));\n\t}\n\telse if (facingLiquidContainer != null && facingLiquidContainer.HasLiquidItem())\n\t{\n\t\tint num = UnityEngine.Mathf.CeilToInt((1f - HeldFraction()) * (float)MaxHoldable());\n\t\tif (num > 0)\n\t\t{\n\t\t\tGetContents();\n\t\t\tItem liquidItem = facingLiquidContainer.GetLiquidItem();\n\t\t\tint num2 = UnityEngine.Mathf.Min(UnityEngine.Mathf.CeilToInt(f), UnityEngine.Mathf.Min(liquidItem.amount, num));\n\t\t\tAddLiquid(liquidItem.info, num2);\n\t\t\tliquidItem.UseItem(num2);\n\t\t\tfacingLiquidContainer.OpenTap(2f);\n\t\t}\n\t}\n\tlastFillTime = UnityEngine.Time.realtimeSinceStartup;\n}\n",
      "ParametersText": "BaseLiquidVessel baseLiquidVessel, BasePlayer local0, LiquidContainer local3",
      "TargetName": "BaseLiquidVessel",
      "MethodName": "FillCheck",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1830760464,
      "Name": "OnDecayHeal",
      "FullName": "OnDecayHeal",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "decayEntity",
          "typeName": "DecayEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a decay is healed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnDecay(Decay decay, float decayDeltaTime)\n{\n\tlastDecayTick = UnityEngine.Time.time;\n\tif (HasParent() || !decay.ShouldDecay(this))\n\t{\n\t\treturn;\n\t}\n\tfloat num = decayDeltaTime * ConVar.Decay.scale;\n\tif (ConVar.Decay.upkeep)\n\t{\n\t\tupkeepTimer += num;\n\t\tif (upkeepTimer > 0f)\n\t\t{\n\t\t\tBuildingPrivlidge buildingPrivilege = GetBuildingPrivilege();\n\t\t\tif (buildingPrivilege != null)\n\t\t\t{\n\t\t\t\tupkeepTimer -= buildingPrivilege.PurchaseUpkeepTime(this, UnityEngine.Mathf.Max(upkeepTimer, 600f));\n\t\t\t}\n\t\t}\n\t\tif (upkeepTimer < 1f)\n\t\t{\n\t\t\tif (base.healthFraction < 1f && GetEntityHealScale() > 0f && base.SecondsSinceAttacked > 600f && Oxide.Core.Interface.CallHook(\"OnDecayHeal\", this) == null)\n\t\t\t{\n\t\t\t\tfloat num2 = decayDeltaTime / GetEntityDecayDuration() * GetEntityHealScale();\n\t\t\t\tHeal(MaxHealth() * num2);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tupkeepTimer = 1f;\n\t}\n\tdecayTimer += num;\n\tif (decayTimer < GetEntityDecayDelay())\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"DecayTick\"))\n\t{\n\t\tfloat num3 = 1f;\n\t\tif (ConVar.Decay.upkeep)\n\t\t{\n\t\t\tif (!BypassInsideDecayMultiplier && !IsOutside())\n\t\t\t{\n\t\t\t\tnum3 *= ConVar.Decay.upkeep_inside_decay_scale;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int i = 0; i < decayPoints.Length; i++)\n\t\t\t{\n\t\t\t\tDecayPoint decayPoint = decayPoints[i];\n\t\t\t\tif (decayPoint.IsOccupied(this))\n\t\t\t\t{\n\t\t\t\t\tnum3 -= decayPoint.protection;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Oxide.Core.Interface.CallHook(\"OnDecayDamage\", this) == null && num3 > 0f)\n\t\t{\n\t\t\tfloat num4 = num / GetEntityDecayDuration() * MaxHealth();\n\t\t\tHurt(num4 * num3 * decayVariance, Rust.DamageType.Decay);\n\t\t}\n\t}\n}\n",
      "ParametersText": "DecayEntity decayEntity",
      "TargetName": "DecayEntity",
      "MethodName": "OnDecay",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1821956534,
      "Name": "OnDecayDamage",
      "FullName": "OnDecayDamage",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "decayEntity",
          "typeName": "DecayEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a decay is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnDecay(Decay decay, float decayDeltaTime)\n{\n\tlastDecayTick = UnityEngine.Time.time;\n\tif (HasParent() || !decay.ShouldDecay(this))\n\t{\n\t\treturn;\n\t}\n\tfloat num = decayDeltaTime * ConVar.Decay.scale;\n\tif (ConVar.Decay.upkeep)\n\t{\n\t\tupkeepTimer += num;\n\t\tif (upkeepTimer > 0f)\n\t\t{\n\t\t\tBuildingPrivlidge buildingPrivilege = GetBuildingPrivilege();\n\t\t\tif (buildingPrivilege != null)\n\t\t\t{\n\t\t\t\tupkeepTimer -= buildingPrivilege.PurchaseUpkeepTime(this, UnityEngine.Mathf.Max(upkeepTimer, 600f));\n\t\t\t}\n\t\t}\n\t\tif (upkeepTimer < 1f)\n\t\t{\n\t\t\tif (base.healthFraction < 1f && GetEntityHealScale() > 0f && base.SecondsSinceAttacked > 600f && Oxide.Core.Interface.CallHook(\"OnDecayHeal\", this) == null)\n\t\t\t{\n\t\t\t\tfloat num2 = decayDeltaTime / GetEntityDecayDuration() * GetEntityHealScale();\n\t\t\t\tHeal(MaxHealth() * num2);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tupkeepTimer = 1f;\n\t}\n\tdecayTimer += num;\n\tif (decayTimer < GetEntityDecayDelay())\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"DecayTick\"))\n\t{\n\t\tfloat num3 = 1f;\n\t\tif (ConVar.Decay.upkeep)\n\t\t{\n\t\t\tif (!BypassInsideDecayMultiplier && !IsOutside())\n\t\t\t{\n\t\t\t\tnum3 *= ConVar.Decay.upkeep_inside_decay_scale;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int i = 0; i < decayPoints.Length; i++)\n\t\t\t{\n\t\t\t\tDecayPoint decayPoint = decayPoints[i];\n\t\t\t\tif (decayPoint.IsOccupied(this))\n\t\t\t\t{\n\t\t\t\t\tnum3 -= decayPoint.protection;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (Oxide.Core.Interface.CallHook(\"OnDecayDamage\", this) == null && num3 > 0f)\n\t\t{\n\t\t\tfloat num4 = num / GetEntityDecayDuration() * MaxHealth();\n\t\t\tHurt(num4 * num3 * decayVariance, Rust.DamageType.Decay);\n\t\t}\n\t}\n}\n",
      "ParametersText": "DecayEntity decayEntity",
      "TargetName": "DecayEntity",
      "MethodName": "OnDecay",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3977000024,
      "Name": "OnDebrisSpawn",
      "FullName": "OnDebrisSpawn",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "decayEntity",
          "typeName": "DecayEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a debris is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SpawnDebris(UnityEngine.Vector3 localPos, UnityEngine.Quaternion rot, bool dropToTerrain)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnDebrisSpawn\", this, localPos, rot, dropToTerrain) != null)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 vector = base.transform.TransformPoint(localPos);\n\tif (dropToTerrain && UnityEngine.Physics.Raycast(vector, UnityEngine.Vector3.down, out var hitInfo, 6f, 8388608))\n\t{\n\t\tfloat num = vector.y - hitInfo.point.y;\n\t\tvector.y = hitInfo.point.y;\n\t\tlocalPos.y -= num;\n\t}\n\tSystem.Collections.Generic.List<DebrisEntity> obj = Facepunch.Pool.Get<System.Collections.Generic.List<DebrisEntity>>();\n\tVis.Entities(vector, 0.1f, obj, 256);\n\tif (obj.Count > 0)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = GameManager.server.CreateEntity(debrisPrefab.resourcePath, base.transform.TransformPoint(localPos), base.transform.rotation * rot);\n\tif ((bool)baseEntity)\n\t{\n\t\tbaseEntity.SetParent(parentEntity.Get(serverside: true), worldPositionStays: true);\n\t\tbaseEntity.Spawn();\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n}\n",
      "ParametersText": "DecayEntity decayEntity",
      "TargetName": "DecayEntity",
      "MethodName": "SpawnDebris",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 410886036,
      "Name": "OnWindmillUpdate",
      "FullName": "OnWindmillUpdate",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "electricWindmill",
          "typeName": "ElectricWindmill",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a windmill is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void WindUpdate()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnWindmillUpdate\", this) == null)\n\t{\n\t\tserverWindSpeed = (AmIVisible() ? GetWindSpeedScale() : 0f);\n\t\tint num = UnityEngine.Mathf.FloorToInt((float)maxPowerGeneration * serverWindSpeed);\n\t\tbool num2 = currentEnergy != num;\n\t\tcurrentEnergy = num;\n\t\tif (num2)\n\t\t{\n\t\t\tMarkDirty();\n\t\t}\n\t\tSendNetworkUpdate();\n\t\tOxide.Core.Interface.CallHook(\"OnWindmillUpdated\", this);\n\t}\n}\n",
      "ParametersText": "ElectricWindmill electricWindmill",
      "TargetName": "ElectricWindmill",
      "MethodName": "WindUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2771292806,
      "Name": "OnWindmillUpdated",
      "FullName": "OnWindmillUpdated",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "electricWindmill",
          "typeName": "ElectricWindmill",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a windmill is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void WindUpdate()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnWindmillUpdate\", this) == null)\n\t{\n\t\tserverWindSpeed = (AmIVisible() ? GetWindSpeedScale() : 0f);\n\t\tint num = UnityEngine.Mathf.FloorToInt((float)maxPowerGeneration * serverWindSpeed);\n\t\tbool num2 = currentEnergy != num;\n\t\tcurrentEnergy = num;\n\t\tif (num2)\n\t\t{\n\t\t\tMarkDirty();\n\t\t}\n\t\tSendNetworkUpdate();\n\t\tOxide.Core.Interface.CallHook(\"OnWindmillUpdated\", this);\n\t}\n}\n",
      "ParametersText": "ElectricWindmill electricWindmill",
      "TargetName": "ElectricWindmill",
      "MethodName": "WindUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3379601556,
      "Name": "CanMannequinChangePose",
      "FullName": "CanMannequinChangePose",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "mannequin",
          "typeName": "Mannequin",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to mannequin change pose.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\nprivate void Server_ChangePose(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player == null) && msg.player.CanBuild(cached: true) && Oxide.Core.Interface.CallHook(\"CanMannequinChangePose\", this, msg.player) == null)\n\t{\n\t\tint num = PoseIndex + 1;\n\t\tif (num >= AvailablePoses.Length)\n\t\t{\n\t\t\tnum = 0;\n\t\t}\n\t\tPoseIndex = num;\n\t\tif (ChangePoseSound.isValid)\n\t\t{\n\t\t\tEffect.server.Run(ChangePoseSound.resourcePath, base.transform.position);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Mannequin mannequin, BasePlayer player",
      "TargetName": "Mannequin",
      "MethodName": "Server_ChangePose",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2888626034,
      "Name": "CanMannequinSwap",
      "FullName": "CanMannequinSwap",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "mannequin",
          "typeName": "Mannequin",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to mannequin swap.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void Server_RequestSwap(BaseEntity.RPCMessage msg)\n{\n\tif (IsEquipping())\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (!CanBeLooted(player) || player.IsDead() || Oxide.Core.Interface.CallHook(\"CanMannequinSwap\", this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tBaseLock @lock = GetLock();\n\tif (@lock != null && !@lock.OnTryToOpen(player))\n\t{\n\t\tplayer.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.ContainerLocked, false);\n\t}\n\telse if (SwapPlayerInventoryWithContainer(msg.player, base.inventory, GetDropPosition(), GetDropVelocity(), FilterItems))\n\t{\n\t\tif (EquipSound != null)\n\t\t{\n\t\t\tEffect.server.Run(EquipSound.resourcePath, player, StringPool.Get(\"spine3\"), UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\tInvoke(ClearEquipping, 1.5f);\n\t}\n}\n",
      "ParametersText": "Mannequin mannequin, BasePlayer local0",
      "TargetName": "Mannequin",
      "MethodName": "Server_RequestSwap",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 318355959,
      "Name": "OnWaterCollect",
      "FullName": "OnWaterCollect [WaterPump]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "waterPump",
          "typeName": "WaterPump",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ItemDefinition",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when water collect occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void CreateWater()\n{\n\tif (!IsFull())\n\t{\n\t\tItemDefinition itemDefinition = WaterResource.SV_GetAtPoint(WaterResourceLocation.position);\n\t\tif (itemDefinition != null && Oxide.Core.Interface.CallHook(\"OnWaterCollect\", this, itemDefinition) == null)\n\t\t{\n\t\t\tbase.inventory.AddItem(itemDefinition, AmountPerPump, 0uL);\n\t\t\tUpdateOnFlag();\n\t\t}\n\t}\n}\n",
      "ParametersText": "WaterPump waterPump, ItemDefinition local0",
      "TargetName": "WaterPump",
      "MethodName": "CreateWater",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 106249974,
      "Name": "OnSprinklerSplashed",
      "FullName": "OnSprinklerSplashed",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "sprinkler",
          "typeName": "Sprinkler",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sprinkler is splashed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoSplash()\n{\n\tusing (TimeWarning.New(\"SprinklerSplash\"))\n\t{\n\t\tint waterAmount = WaterPerSplash;\n\t\tusing (PooledList<ISplashable> pooledList = Facepunch.Pool.Get<PooledList<ISplashable>>())\n\t\t{\n\t\t\tUnityEngine.Vector3 position = Eyes.position;\n\t\t\tif ((float)updateSplashableCache > SplashFrequency * 4f || forceUpdateSplashables)\n\t\t\t{\n\t\t\t\tcachedSplashables.Clear();\n\t\t\t\tforceUpdateSplashables = false;\n\t\t\t\tupdateSplashableCache = 0f;\n\t\t\t\tUnityEngine.Vector3 up = base.transform.up;\n\t\t\t\tfloat sprinklerEyeHeightOffset = ConVar.Server.sprinklerEyeHeightOffset;\n\t\t\t\tfloat value = UnityEngine.Vector3.Angle(up, UnityEngine.Vector3.up) / 180f;\n\t\t\t\tvalue = UnityEngine.Mathf.Clamp(value, 0.2f, 1f);\n\t\t\t\tsprinklerEyeHeightOffset *= value;\n\t\t\t\tUnityEngine.Vector3 vector = position + up * (ConVar.Server.sprinklerRadius * 0.5f);\n\t\t\t\tUnityEngine.Vector3 b = position + up * sprinklerEyeHeightOffset;\n\t\t\t\tSystem.Collections.Generic.List<BaseEntity> obj = Facepunch.Pool.Get<System.Collections.Generic.List<BaseEntity>>();\n\t\t\t\tUnityEngine.Vector3 vector2 = UnityEngine.Vector3.Lerp(vector, b, 0.5f);\n\t\t\t\tDynamicObjectsTrigger.transform.position = vector2;\n\t\t\t\tDynamicObjectsTrigger.transform.up = (vector2 - vector).normalized;\n\t\t\t\tSplashableGrid.UpdateMobileEntities();\n\t\t\t\tSplashableGrid.Grid.Query(vector2.x, vector2.z, ConVar.Server.sprinklerRadius, obj);\n\t\t\t\tif (obj.Count > 0)\n\t\t\t\t{\n\t\t\t\t\tOBB oBB = new OBB(DynamicObjectsTrigger.transform, new UnityEngine.Bounds(DynamicObjectsTrigger.Capsule.center, DynamicObjectsTrigger.Capsule.bounds.extents * 2f));\n\t\t\t\t\tforeach (BaseEntity item in obj)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (item != null && oBB.Intersects(item.WorldSpaceBounds()) && ProcessEntity(item, out var foundSplashable2) && item.IsVisible(position))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcachedSplashables.Add(foundSplashable2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t\t}\n\t\t\tforeach (ISplashable cachedSplashable in cachedSplashables)\n\t\t\t{\n\t\t\t\tpooledList.Add(cachedSplashable);\n\t\t\t}\n\t\t\tusing (TimeWarning.New(\"UpdateDynamicSplashables\"))\n\t\t\t{\n\t\t\t\tif (DynamicObjectsTrigger.entityContents != null)\n\t\t\t\t{\n\t\t\t\t\tforeach (BaseEntity entityContent in DynamicObjectsTrigger.entityContents)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (ProcessEntity(entityContent, out var foundSplashable3))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (DynamicObjectsTrigger.ShouldCheckLineOfSight(entityContent))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tDynamicObjectsTrigger.RecordLineOfSight(entityContent, entityContent.IsVisible(position));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (DynamicObjectsTrigger.HasLineOfSight(entityContent))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpooledList.Add(foundSplashable3);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pooledList.Count > 0)\n\t\t\t{\n\t\t\t\tint num = waterAmount / pooledList.Count;\n\t\t\t\tfloat num2 = (float)(waterAmount % pooledList.Count) / (float)pooledList.Count;\n\t\t\t\tforeach (ISplashable item2 in pooledList)\n\t\t\t\t{\n\t\t\t\t\tint amount = num + ((UnityEngine.Random.value < num2) ? 1 : 0);\n\t\t\t\t\tif (!ObjectEx.IsUnityNull(item2) && item2.WantsSplash(currentFuelType, amount))\n\t\t\t\t\t{\n\t\t\t\t\t\tint num3 = item2.DoSplash(currentFuelType, amount);\n\t\t\t\t\t\twaterAmount -= num3;\n\t\t\t\t\t\tif (waterAmount <= 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (DecayPerSplash > 0f)\n\t\t\t{\n\t\t\t\tHurt(DecayPerSplash);\n\t\t\t}\n\t\t}\n\t\tbool ProcessEntity(BaseEntity targetEnt, out ISplashable foundSplashable)\n\t\t{\n\t\t\tfoundSplashable = null;\n\t\t\tif (targetEnt.isClient)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (targetEnt is ISplashable splashable && splashable.WantsSplash(currentFuelType, waterAmount))\n\t\t\t{\n\t\t\t\tif (targetEnt is IOEntity entity && IsConnectedTo(entity, IOEntity.backtracking))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (targetEnt is BasePlayer && currentFuelType.baseRadioactivity > 0f)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tfoundSplashable = splashable;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnSprinklerSplashed\", this);\n}\n",
      "ParametersText": "Sprinkler sprinkler",
      "TargetName": "Sprinkler",
      "MethodName": "DoSplash",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1337570747,
      "Name": "CanWaterBallSplash",
      "FullName": "CanWaterBallSplash",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "liquidDef",
          "typeName": "ItemDefinition",
          "optional": false
        },
        {
          "name": "position",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "radius",
          "typeName": "System.Single",
          "optional": false
        },
        {
          "name": "amount",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "funWater",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to water ball splash.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool DoSplash(UnityEngine.Vector3 position, float radius, ItemDefinition liquidDef, int amount, bool funWater = false)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanWaterBallSplash\", liquidDef, position, radius, amount, funWater);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tSystem.Collections.Generic.List<BaseEntity> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<BaseEntity>>();\n\tVis.Entities(position, radius, obj2, 1220225811);\n\tint num = 0;\n\tint num2 = amount;\n\tbool flag = false;\n\twhile (amount > 0 && num < 3)\n\t{\n\t\tSystem.Collections.Generic.List<ISplashable> obj3 = Facepunch.Pool.Get<System.Collections.Generic.List<ISplashable>>();\n\t\tforeach (BaseEntity item in obj2)\n\t\t{\n\t\t\tif (item.isClient || !(item is ISplashable splashable) || obj3.Contains(splashable) || !splashable.WantsSplash(liquidDef, amount))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbool flag2 = true;\n\t\t\tbool flag3 = item is PlanterBox;\n\t\t\tbool flag4 = item is TimedExplosive;\n\t\t\tif (flag3 || flag4)\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 vector = UnityEngine.Vector3.zero;\n\t\t\t\tif (flag3)\n\t\t\t\t{\n\t\t\t\t\tvector = UnityEngine.Vector3.up;\n\t\t\t\t}\n\t\t\t\tif (!GamePhysics.LineOfSight(item.transform.position + vector, position, 136314880))\n\t\t\t\t{\n\t\t\t\t\tflag2 = false;\n\t\t\t\t}\n\t\t\t\tif (flag2)\n\t\t\t\t{\n\t\t\t\t\tflag = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flag2)\n\t\t\t{\n\t\t\t\tobj3.Add(splashable);\n\t\t\t}\n\t\t}\n\t\tif (obj3.Count == 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tint b = UnityEngine.Mathf.CeilToInt(amount / obj3.Count);\n\t\tforeach (ISplashable item2 in obj3)\n\t\t{\n\t\t\tif (!flag || !(item2 is BasePlayer))\n\t\t\t{\n\t\t\t\tint num3 = 0;\n\t\t\t\tBasePlayer basePlayer = item2 as BasePlayer;\n\t\t\t\tnum3 = ((!((object)basePlayer != null && funWater)) ? item2.DoSplash(liquidDef, UnityEngine.Mathf.Min(amount, b)) : basePlayer.DoSplashFunWater(liquidDef, UnityEngine.Mathf.Min(amount, b)));\n\t\t\t\tamount -= num3;\n\t\t\t\tif (amount <= 0)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj3);\n\t\tnum++;\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\treturn amount < num2;\n}\n",
      "ParametersText": "ItemDefinition liquidDef, UnityEngine.Vector3 position, float radius, int amount, bool funWater",
      "TargetName": "WaterBall",
      "MethodName": "DoSplash",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2202497682,
      "Name": "OnPhotoCapture",
      "FullName": "OnPhotoCapture",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local5",
          "typeName": "PhotoEntity",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.Byte[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when photo capture occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server]\nprivate void TakePhoto(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tItem item = GetItem();\n\tif (player == null || item == null || item.condition <= 0f)\n\t{\n\t\treturn;\n\t}\n\tbyte[] array = msg.read.BytesWithSize();\n\tif (array.Length > 102400 || !ImageProcessing.IsValidJPG(array, resolutionX, resolutionY))\n\t{\n\t\treturn;\n\t}\n\tItem item2 = ItemManager.Create(photoItem, 1, 0uL);\n\tif (item2 == null)\n\t{\n\t\tUnityEngine.Debug.LogError(\"Failed to create photo item\");\n\t\treturn;\n\t}\n\titem2.SetItemOwnership(msg.player, ItemOwnershipPhrases.Photographed);\n\tif (!item2.instanceData.subEntity.IsValid)\n\t{\n\t\titem2.Remove();\n\t\tUnityEngine.Debug.LogError(\"Photo has no sub-entity\");\n\t\treturn;\n\t}\n\tBaseNetworkable baseNetworkable = BaseNetworkable.serverEntities.Find(item2.instanceData.subEntity);\n\tif (baseNetworkable == null)\n\t{\n\t\titem2.Remove();\n\t\tUnityEngine.Debug.LogError(\"Sub-entity was not found\");\n\t}\n\telse if (!(baseNetworkable is PhotoEntity photoEntity))\n\t{\n\t\titem2.Remove();\n\t\tUnityEngine.Debug.LogError(\"Sub-entity is not a photo\");\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhotoCapture\", photoEntity, item, player, array) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tphotoEntity.SetImageData(player.userID, array);\n\t\tif (!player.inventory.GiveItem(item2))\n\t\t{\n\t\t\titem2.Drop(player.GetDropPosition(), player.GetDropVelocity());\n\t\t}\n\t\tEffectNetwork.Send(new Effect(screenshotEffect.resourcePath, base.transform.position, base.transform.forward, msg.connection));\n\t\tif (HasFlag(BaseEntity.Flags.Reserved5))\n\t\t{\n\t\t\tEffectNetwork.Send(new Effect(flashEffect.resourcePath, localFlash.transform.position, localFlash.transform.forward, msg.connection));\n\t\t}\n\t\tif (!hasSentAchievement && !string.IsNullOrEmpty(\"SUMMER_PAPARAZZI\"))\n\t\t{\n\t\t\tUnityEngine.Vector3 position = GetOwnerPlayer().eyes.position;\n\t\t\tUnityEngine.Vector3 vector = GetOwnerPlayer().eyes.HeadForward();\n\t\t\tSystem.Collections.Generic.List<BasePlayer> obj = Facepunch.Pool.Get<System.Collections.Generic.List<BasePlayer>>();\n\t\t\tVis.Entities(position + vector * 5f, 5f, obj, 131072);\n\t\t\tforeach (BasePlayer item3 in obj)\n\t\t\t{\n\t\t\t\tif (item3.isServer && item3 != GetOwnerPlayer() && item3.IsVisible(GetOwnerPlayer().eyes.position))\n\t\t\t\t{\n\t\t\t\t\thasSentAchievement = true;\n\t\t\t\t\tGetOwnerPlayer().GiveAchievement(\"SUMMER_PAPARAZZI\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t\titem.LoseCondition(1f);\n\t\tOxide.Core.Interface.CallHook(\"OnPhotoCaptured\", photoEntity, item, player, array);\n\t}\n}\n",
      "ParametersText": "PhotoEntity local5, Item local1, BasePlayer local0, System.Byte[] local2",
      "TargetName": "InstantCameraTool",
      "MethodName": "TakePhoto",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1706180494,
      "Name": "OnPhotoCaptured",
      "FullName": "OnPhotoCaptured",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local5",
          "typeName": "PhotoEntity",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.Byte[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a photo is captured."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server]\nprivate void TakePhoto(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tItem item = GetItem();\n\tif (player == null || item == null || item.condition <= 0f)\n\t{\n\t\treturn;\n\t}\n\tbyte[] array = msg.read.BytesWithSize();\n\tif (array.Length > 102400 || !ImageProcessing.IsValidJPG(array, resolutionX, resolutionY))\n\t{\n\t\treturn;\n\t}\n\tItem item2 = ItemManager.Create(photoItem, 1, 0uL);\n\tif (item2 == null)\n\t{\n\t\tUnityEngine.Debug.LogError(\"Failed to create photo item\");\n\t\treturn;\n\t}\n\titem2.SetItemOwnership(msg.player, ItemOwnershipPhrases.Photographed);\n\tif (!item2.instanceData.subEntity.IsValid)\n\t{\n\t\titem2.Remove();\n\t\tUnityEngine.Debug.LogError(\"Photo has no sub-entity\");\n\t\treturn;\n\t}\n\tBaseNetworkable baseNetworkable = BaseNetworkable.serverEntities.Find(item2.instanceData.subEntity);\n\tif (baseNetworkable == null)\n\t{\n\t\titem2.Remove();\n\t\tUnityEngine.Debug.LogError(\"Sub-entity was not found\");\n\t}\n\telse if (!(baseNetworkable is PhotoEntity photoEntity))\n\t{\n\t\titem2.Remove();\n\t\tUnityEngine.Debug.LogError(\"Sub-entity is not a photo\");\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhotoCapture\", photoEntity, item, player, array) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tphotoEntity.SetImageData(player.userID, array);\n\t\tif (!player.inventory.GiveItem(item2))\n\t\t{\n\t\t\titem2.Drop(player.GetDropPosition(), player.GetDropVelocity());\n\t\t}\n\t\tEffectNetwork.Send(new Effect(screenshotEffect.resourcePath, base.transform.position, base.transform.forward, msg.connection));\n\t\tif (HasFlag(BaseEntity.Flags.Reserved5))\n\t\t{\n\t\t\tEffectNetwork.Send(new Effect(flashEffect.resourcePath, localFlash.transform.position, localFlash.transform.forward, msg.connection));\n\t\t}\n\t\tif (!hasSentAchievement && !string.IsNullOrEmpty(\"SUMMER_PAPARAZZI\"))\n\t\t{\n\t\t\tUnityEngine.Vector3 position = GetOwnerPlayer().eyes.position;\n\t\t\tUnityEngine.Vector3 vector = GetOwnerPlayer().eyes.HeadForward();\n\t\t\tSystem.Collections.Generic.List<BasePlayer> obj = Facepunch.Pool.Get<System.Collections.Generic.List<BasePlayer>>();\n\t\t\tVis.Entities(position + vector * 5f, 5f, obj, 131072);\n\t\t\tforeach (BasePlayer item3 in obj)\n\t\t\t{\n\t\t\t\tif (item3.isServer && item3 != GetOwnerPlayer() && item3.IsVisible(GetOwnerPlayer().eyes.position))\n\t\t\t\t{\n\t\t\t\t\thasSentAchievement = true;\n\t\t\t\t\tGetOwnerPlayer().GiveAchievement(\"SUMMER_PAPARAZZI\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t\titem.LoseCondition(1f);\n\t\tOxide.Core.Interface.CallHook(\"OnPhotoCaptured\", photoEntity, item, player, array);\n\t}\n}\n",
      "ParametersText": "PhotoEntity local5, Item local1, BasePlayer local0, System.Byte[] local2",
      "TargetName": "InstantCameraTool",
      "MethodName": "TakePhoto",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2763718002,
      "Name": "OnTreeMarkerHit",
      "FullName": "OnTreeMarkerHit",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "treeEntity",
          "typeName": "TreeEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a tree marker hits."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool DidHitMarker(HitInfo info)\n{\n\tif (xMarker == null)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnTreeMarkerHit\", this, info);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (PrefabAttribute.server.Find<TreeMarkerData>(prefabID) != null)\n\t{\n\t\tif (new UnityEngine.Bounds(xMarker.transform.position, UnityEngine.Vector3.one * 0.2f).Contains(info.HitPositionWorld))\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tUnityEngine.Vector3 lhs = UnityEngine.Vector3Ex.Direction2D(base.transform.position, xMarker.transform.position);\n\t\tUnityEngine.Vector3 attackNormal = info.attackNormal;\n\t\tfloat num = UnityEngine.Vector3.Dot(lhs, attackNormal);\n\t\tfloat num2 = UnityEngine.Vector3.SqrMagnitude(xMarker.transform.position - info.HitPositionWorld);\n\t\tif (num >= 0.3f && num2 <= 0.0400000028f)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n",
      "ParametersText": "TreeEntity treeEntity",
      "TargetName": "TreeEntity",
      "MethodName": "DidHitMarker",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2810379356,
      "Name": "OnSprayRemove",
      "FullName": "OnSprayRemove",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "sprayCanSpray",
          "typeName": "SprayCanSpray",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a spray is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\nprivate void Server_RequestWaterClear(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && Menu_WaterClear_ShowIf(player) && Oxide.Core.Interface.CallHook(\"OnSprayRemove\", this, player) == null)\n\t{\n\t\tKill();\n\t}\n}\n",
      "ParametersText": "SprayCanSpray sprayCanSpray, BasePlayer local0",
      "TargetName": "SprayCanSpray",
      "MethodName": "Server_RequestWaterClear",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2286299788,
      "Name": "OnComposterUpdate",
      "FullName": "OnComposterUpdate",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "composter",
          "typeName": "Composter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a composter is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateComposting()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnComposterUpdate\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i < base.inventory.capacity; i++)\n\t{\n\t\tItem slot = base.inventory.GetSlot(i);\n\t\tif (slot != null)\n\t\t{\n\t\t\tCompostItem(slot);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Composter composter",
      "TargetName": "Composter",
      "MethodName": "UpdateComposting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2122349615,
      "Name": "OnRemoteIdentifierUpdate",
      "FullName": "OnRemoteIdentifierUpdate",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "poweredRemoteControlEntity",
          "typeName": "PoweredRemoteControlEntity",
          "optional": false
        },
        {
          "name": "newID",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote identifier is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateIdentifier(string newID, bool clientSend = false)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnRemoteIdentifierUpdate\", this, newID) != null)\n\t{\n\t\treturn;\n\t}\n\t_ = rcIdentifier;\n\tif (base.isServer)\n\t{\n\t\tif (!RemoteControlEntity.IDInUse(newID))\n\t\t{\n\t\t\trcIdentifier = newID;\n\t\t}\n\t\tif (!Rust.Application.isLoadingSave)\n\t\t{\n\t\t\tSendNetworkUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "PoweredRemoteControlEntity poweredRemoteControlEntity, string newID",
      "TargetName": "PoweredRemoteControlEntity",
      "MethodName": "UpdateIdentifier",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4040320602,
      "Name": "OnSwitchToggle",
      "FullName": "OnSwitchToggle [IndustrialConveyor]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "industrialConveyor",
          "typeName": "IndustrialConveyor",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a switch toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void SvSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnSwitchToggle\", this, msg.player) == null)\n\t{\n\t\tSetSwitch(!IsOn());\n\t\tOxide.Core.Interface.CallHook(\"OnSwitchToggled\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "IndustrialConveyor industrialConveyor, BasePlayer player",
      "TargetName": "IndustrialConveyor",
      "MethodName": "SvSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 588890708,
      "Name": "OnSwitchToggled",
      "FullName": "OnSwitchToggled [IndustrialConveyor]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "industrialConveyor",
          "typeName": "IndustrialConveyor",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a switch toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void SvSwitch(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnSwitchToggle\", this, msg.player) == null)\n\t{\n\t\tSetSwitch(!IsOn());\n\t\tOxide.Core.Interface.CallHook(\"OnSwitchToggled\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "IndustrialConveyor industrialConveyor, BasePlayer player",
      "TargetName": "IndustrialConveyor",
      "MethodName": "SvSwitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2031840135,
      "Name": "CanExplosiveStick",
      "FullName": "CanExplosiveStick",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "timedExplosive",
          "typeName": "TimedExplosive",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to explosive stick.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanStickTo(BaseEntity entity)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanExplosiveStick\", this, entity);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (entity.TryGetComponent<DecorDeployable>(out var _))\n\t{\n\t\treturn false;\n\t}\n\tif (entity is Drone)\n\t{\n\t\treturn false;\n\t}\n\tif (entity is TravellingVendor)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "TimedExplosive timedExplosive",
      "TargetName": "TimedExplosive",
      "MethodName": "CanStickTo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2148378817,
      "Name": "OnPatrolHelicopterTakeDamage",
      "FullName": "OnPatrolHelicopterTakeDamage",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "patrolHelicopter",
          "typeName": "PatrolHelicopter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a patrol helicopter take is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Hurt(HitInfo info)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPatrolHelicopterTakeDamage\", this, info) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = false;\n\tif (info.damageTypes.Total() >= base.health)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPatrolHelicopterKill\", this, info) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbase.health = 10000f;\n\t\tmyAI.CriticalDamage();\n\t\tflag = true;\n\t}\n\tbase.Hurt(info);\n\tif (flag)\n\t{\n\t\treturn;\n\t}\n\tmyAI.OtherDamaged(info);\n\tPatrolHelicopter.weakspot[] array = weakspots;\n\tforeach (PatrolHelicopter.weakspot weakspot in array)\n\t{\n\t\tstring[] bonenames = weakspot.bonenames;\n\t\tforeach (string str in bonenames)\n\t\t{\n\t\t\tif (info.HitBone == StringPool.Get(str))\n\t\t\t{\n\t\t\t\tweakspot.Hurt(info.damageTypes.Total(), info);\n\t\t\t\tmyAI.WeakspotDamaged(weakspot, info);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "PatrolHelicopter patrolHelicopter",
      "TargetName": "PatrolHelicopter",
      "MethodName": "Hurt",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1857089938,
      "Name": "OnPatrolHelicopterKill",
      "FullName": "OnPatrolHelicopterKill",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "patrolHelicopter",
          "typeName": "PatrolHelicopter",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a patrol helicopter is killed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Hurt(HitInfo info)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPatrolHelicopterTakeDamage\", this, info) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = false;\n\tif (info.damageTypes.Total() >= base.health)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPatrolHelicopterKill\", this, info) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbase.health = 10000f;\n\t\tmyAI.CriticalDamage();\n\t\tflag = true;\n\t}\n\tbase.Hurt(info);\n\tif (flag)\n\t{\n\t\treturn;\n\t}\n\tmyAI.OtherDamaged(info);\n\tPatrolHelicopter.weakspot[] array = weakspots;\n\tforeach (PatrolHelicopter.weakspot weakspot in array)\n\t{\n\t\tstring[] bonenames = weakspot.bonenames;\n\t\tforeach (string str in bonenames)\n\t\t{\n\t\t\tif (info.HitBone == StringPool.Get(str))\n\t\t\t{\n\t\t\t\tweakspot.Hurt(info.damageTypes.Total(), info);\n\t\t\t\tmyAI.WeakspotDamaged(weakspot, info);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "PatrolHelicopter patrolHelicopter, HitInfo info",
      "TargetName": "PatrolHelicopter",
      "MethodName": "Hurt",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2131038016,
      "Name": "OnCrateSpawned",
      "FullName": "OnCrateSpawned [PatrolHelicopter]",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "patrolHelicopter",
          "typeName": "PatrolHelicopter",
          "optional": false
        },
        {
          "name": "local14",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a crate is spawned.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnDied(HitInfo info)\n{\n\tif (base.isClient)\n\t{\n\t\treturn;\n\t}\n\tCreateExplosionMarker(10f);\n\tEffect.server.Run(explosionEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up, null, broadcast: true);\n\tUnityEngine.Vector3 vector = myAI.GetLastMoveDir() * myAI.GetMoveSpeed() * 0.75f;\n\tUnityEngine.GameObject gibSource = servergibs.Get().GetComponent<ServerGib>()._gibSource;\n\tSystem.Collections.Generic.List<ServerGib> list = ServerGib.CreateGibs(servergibs.resourcePath, base.gameObject, gibSource, vector, 3f);\n\tif (info.damageTypes.GetMajorityDamageType() != Rust.DamageType.Decay)\n\t{\n\t\tfor (int i = 0; i < 12 - maxCratesToSpawn; i++)\n\t\t{\n\t\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(this.fireBall.resourcePath, base.transform.position, base.transform.rotation);\n\t\t\tif (!baseEntity)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfloat minInclusive = 3f;\n\t\t\tfloat maxInclusive = 10f;\n\t\t\tUnityEngine.Vector3 onUnitSphere = UnityEngine.Random.onUnitSphere;\n\t\t\tbaseEntity.transform.position = base.transform.position + new UnityEngine.Vector3(0f, 1.5f, 0f) + onUnitSphere * UnityEngine.Random.Range(-4f, 4f);\n\t\t\tUnityEngine.Collider component = baseEntity.GetComponent<UnityEngine.Collider>();\n\t\t\tbaseEntity.Spawn();\n\t\t\tbaseEntity.SetVelocity(vector + onUnitSphere * UnityEngine.Random.Range(minInclusive, maxInclusive));\n\t\t\tforeach (ServerGib item in list)\n\t\t\t{\n\t\t\t\tUnityEngine.Physics.IgnoreCollision(component, item.GetCollider(), ignore: true);\n\t\t\t}\n\t\t}\n\t}\n\tfor (int j = 0; j < maxCratesToSpawn; j++)\n\t{\n\t\tUnityEngine.Vector3 onUnitSphere2 = UnityEngine.Random.onUnitSphere;\n\t\tUnityEngine.Vector3 pos = base.transform.position + new UnityEngine.Vector3(0f, 1.5f, 0f) + onUnitSphere2 * UnityEngine.Random.Range(2f, 3f);\n\t\tBaseEntity baseEntity2 = GameManager.server.CreateEntity(crateToDrop.resourcePath, pos, UnityEngine.Quaternion.LookRotation(onUnitSphere2));\n\t\tbaseEntity2.Spawn();\n\t\tLootContainer lootContainer = baseEntity2 as LootContainer;\n\t\tif ((bool)lootContainer)\n\t\t{\n\t\t\tlootContainer.Invoke(lootContainer.RemoveMe, 1800f);\n\t\t}\n\t\tUnityEngine.Collider component2 = baseEntity2.GetComponent<UnityEngine.Collider>();\n\t\tUnityEngine.Rigidbody rigidbody = baseEntity2.gameObject.AddComponent<UnityEngine.Rigidbody>();\n\t\trigidbody.useGravity = true;\n\t\trigidbody.collisionDetectionMode = UnityEngine.CollisionDetectionMode.ContinuousDynamic;\n\t\trigidbody.mass = 2f;\n\t\trigidbody.interpolation = UnityEngine.RigidbodyInterpolation.Interpolate;\n\t\trigidbody.velocity = vector + onUnitSphere2 * UnityEngine.Random.Range(1f, 3f);\n\t\trigidbody.angularVelocity = UnityEngine.Vector3Ex.Range(-1.75f, 1.75f);\n\t\trigidbody.drag = 0.5f * (rigidbody.mass / 5f);\n\t\trigidbody.angularDrag = 0.2f * (rigidbody.mass / 5f);\n\t\tFireBall fireBall = GameManager.server.CreateEntity(this.fireBall.resourcePath) as FireBall;\n\t\tif ((bool)fireBall)\n\t\t{\n\t\t\tfireBall.SetParent(baseEntity2);\n\t\t\tfireBall.Spawn();\n\t\t\tfireBall.GetComponent<UnityEngine.Rigidbody>().isKinematic = true;\n\t\t\tfireBall.GetComponent<UnityEngine.Collider>().enabled = false;\n\t\t}\n\t\tbaseEntity2.SendMessage(\"SetLockingEnt\", fireBall.gameObject, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tforeach (ServerGib item2 in list)\n\t\t{\n\t\t\tUnityEngine.Physics.IgnoreCollision(component2, item2.GetCollider(), ignore: true);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnCrateSpawned\", this, baseEntity2);\n\t}\n\tbase.OnDied(info);\n}\n",
      "ParametersText": "PatrolHelicopter patrolHelicopter, BaseEntity local14",
      "TargetName": "PatrolHelicopter",
      "MethodName": "OnDied",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1359265040,
      "Name": "OnPlanterBoxFertilize",
      "FullName": "OnPlanterBoxFertilize",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "planterBox",
          "typeName": "PlanterBox",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when planter box fertilize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FertilizeGrowables()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlanterBoxFertilize\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tint num = GetFertilizerCount();\n\tif (num <= 0)\n\t{\n\t\treturn;\n\t}\n\tforeach (BaseEntity child in children)\n\t{\n\t\tif (child == null)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tGrowableEntity growableEntity = child as GrowableEntity;\n\t\tif (!(growableEntity == null) && !growableEntity.Fertilized && ConsumeFertilizer())\n\t\t{\n\t\t\tgrowableEntity.Fertilize();\n\t\t\tnum--;\n\t\t\tif (num == 0)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "PlanterBox planterBox",
      "TargetName": "PlanterBox",
      "MethodName": "FertilizeGrowables",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3242619378,
      "Name": "OnNoGoZoneAdded",
      "FullName": "OnNoGoZoneAdded",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a no go zone is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void NoGoZoneAdded(PatrolHelicopterAI.DangerZone zone)\n{\n\tif (use_danger_zones && Oxide.Core.Interface.CallHook(\"OnNoGoZoneAdded\", this, zone) == null && !zone.IsInMonument)\n\t{\n\t\tClearTargets();\n\t\tExitCurrentState();\n\t\tState_Flee_Enter();\n\t}\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "NoGoZoneAdded",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2973375059,
      "Name": "OnEventTrigger",
      "FullName": "OnEventTrigger",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "triggeredEventPrefab",
          "typeName": "TriggeredEventPrefab",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when event trigger occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void RunEvent()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEventTrigger\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Debug.Log(\"[event] \" + targetPrefab.resourcePath);\n\tBaseEntity baseEntity = GameManager.server.CreateEntity(targetPrefab.resourcePath);\n\tif ((bool)baseEntity)\n\t{\n\t\tbaseEntity.SendMessage(\"TriggeredEventSpawn\", UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tbaseEntity.Spawn();\n\t\tbaseEntity.SendMessage(\"TriggeredEventPostSpawn\", UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tspawnedEntity = baseEntity;\n\t\tif (shouldBroadcastSpawn)\n\t\t{\n\t\t\tBasePlayer.Server_SendWorldNotificationToAllActivePlayers(notificationType, spawnedEntity.transform.position);\n\t\t}\n\t}\n}\n",
      "ParametersText": "TriggeredEventPrefab triggeredEventPrefab",
      "TargetName": "TriggeredEventPrefab",
      "MethodName": "RunEvent",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "worldItem",
          "typeName": "WorldItem",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_OpenLoot(BaseEntity.RPCMessage rpc)\n{\n\tif (item == null || item.contents == null)\n\t{\n\t\treturn;\n\t}\n\tItemModContainer component = item.info.GetComponent<ItemModContainer>();\n\tif (!(component == null) && component.canLootInWorld)\n\t{\n\t\tBasePlayer player = rpc.player;\n\t\tif ((bool)player && player.CanInteract() && CanOpenInSafeZone(player) && Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) == null && player.inventory.loot.StartLootingEntity(this))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Open, b: true);\n\t\t\tplayer.inventory.loot.AddContainer(item.contents);\n\t\t\tplayer.inventory.loot.SendImmediate();\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), \"generic_resizable\");\n\t\t\tSendNetworkUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "WorldItem worldItem",
      "TargetName": "WorldItem",
      "MethodName": "RPC_OpenLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2671411290,
      "Name": "OnFreeableContainerRelease",
      "FullName": "OnFreeableContainerRelease",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "freeableLootContainer",
          "typeName": "FreeableLootContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when freeable container release occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Release(BasePlayer ply)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnFreeableContainerRelease\", this, ply) == null)\n\t{\n\t\tGetRB().isKinematic = false;\n\t\tbuoyancy.enabled = true;\n\t\tbuoyancy.buoyancyScale = 1f;\n\t\tSetFlag(BaseEntity.Flags.Reserved8, b: false);\n\t\tToggleNetworkPositionTick(isEnabled: true);\n\t\tif (freedEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(freedEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tif (ply != null && !ply.IsNpc && ply.IsConnected && net != null)\n\t\t{\n\t\t\tply.ProcessMissionEvent(BaseMission.MissionEventType.FREE_CRATE, net.ID, 1f);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnFreeUnderwaterCrate(ply, this);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnFreeableContainerReleased\", this, ply);\n\t}\n}\n",
      "ParametersText": "FreeableLootContainer freeableLootContainer",
      "TargetName": "FreeableLootContainer",
      "MethodName": "Release",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3030262603,
      "Name": "OnFreeableContainerReleased",
      "FullName": "OnFreeableContainerReleased",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "freeableLootContainer",
          "typeName": "FreeableLootContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a freeable contAIner is released."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Release(BasePlayer ply)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnFreeableContainerRelease\", this, ply) == null)\n\t{\n\t\tGetRB().isKinematic = false;\n\t\tbuoyancy.enabled = true;\n\t\tbuoyancy.buoyancyScale = 1f;\n\t\tSetFlag(BaseEntity.Flags.Reserved8, b: false);\n\t\tToggleNetworkPositionTick(isEnabled: true);\n\t\tif (freedEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(freedEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tif (ply != null && !ply.IsNpc && ply.IsConnected && net != null)\n\t\t{\n\t\t\tply.ProcessMissionEvent(BaseMission.MissionEventType.FREE_CRATE, net.ID, 1f);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnFreeUnderwaterCrate(ply, this);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnFreeableContainerReleased\", this, ply);\n\t}\n}\n",
      "ParametersText": "FreeableLootContainer freeableLootContainer",
      "TargetName": "FreeableLootContainer",
      "MethodName": "Release",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1361485205,
      "Name": "OnFreeableContainerReleaseStarted",
      "FullName": "OnFreeableContainerReleaseStarted",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "freeableLootContainer",
          "typeName": "FreeableLootContainer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a freeable contAIner release starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_FreeCrateTimer(BaseEntity.RPCMessage msg)\n{\n\tif (IsTiedDown())\n\t{\n\t\tstartUntieTime = UnityEngine.Time.realtimeSinceStartup;\n\t\tOxide.Core.Interface.CallHook(\"OnFreeableContainerReleaseStarted\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "FreeableLootContainer freeableLootContainer, BasePlayer player",
      "TargetName": "FreeableLootContainer",
      "MethodName": "RPC_FreeCrateTimer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3408508920,
      "Name": "OnGibsSpawned",
      "FullName": "OnGibsSpawned",
      "Category": "Entity",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "System.Collections.Generic.List`1[ServerGib]",
          "optional": false
        },
        {
          "name": "creator",
          "typeName": "UnityEngine.GameObject",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a gibs is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static System.Collections.Generic.List<ServerGib> CreateGibs(string entityToCreatePath, UnityEngine.GameObject creator, UnityEngine.GameObject gibSource, UnityEngine.Vector3 inheritVelocity, float spreadVelocity)\n{\n\tSystem.Collections.Generic.List<ServerGib> list = new System.Collections.Generic.List<ServerGib>();\n\tUnityEngine.MeshRenderer[] componentsInChildren = gibSource.GetComponentsInChildren<UnityEngine.MeshRenderer>(includeInactive: true);\n\tforeach (UnityEngine.MeshRenderer meshRenderer in componentsInChildren)\n\t{\n\t\tUnityEngine.MeshFilter component = meshRenderer.GetComponent<UnityEngine.MeshFilter>();\n\t\tUnityEngine.Vector3 normalized = meshRenderer.transform.localPosition.normalized;\n\t\tUnityEngine.Vector3 vector = creator.transform.localToWorldMatrix.MultiplyPoint(meshRenderer.transform.localPosition) + normalized * 0.5f;\n\t\tUnityEngine.Quaternion quaternion = creator.transform.rotation * meshRenderer.transform.localRotation;\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(entityToCreatePath, vector, quaternion);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tServerGib component2 = baseEntity.GetComponent<ServerGib>();\n\t\t\tcomponent2.transform.SetPositionAndRotation(vector, quaternion);\n\t\t\tcomponent2._gibName = meshRenderer.name;\n\t\t\tUnityEngine.MeshCollider component3 = meshRenderer.GetComponent<UnityEngine.MeshCollider>();\n\t\t\tUnityEngine.Mesh physicsMesh = ((component3 != null) ? component3.sharedMesh : component.sharedMesh);\n\t\t\tcomponent2.PhysicsInit(physicsMesh);\n\t\t\tUnityEngine.Vector3 vector2 = meshRenderer.transform.localPosition.normalized * spreadVelocity;\n\t\t\tcomponent2.rigidBody.velocity = inheritVelocity + vector2;\n\t\t\tcomponent2.rigidBody.angularVelocity = UnityEngine.Vector3Ex.Range(-1f, 1f).normalized * 1f;\n\t\t\tcomponent2.rigidBody.WakeUp();\n\t\t\tcomponent2.Spawn();\n\t\t\tlist.Add(component2);\n\t\t}\n\t}\n\tforeach (ServerGib item in list)\n\t{\n\t\tforeach (ServerGib item2 in list)\n\t\t{\n\t\t\tif (!(item == item2))\n\t\t\t{\n\t\t\t\tUnityEngine.Physics.IgnoreCollision(item2.GetCollider(), item.GetCollider(), ignore: true);\n\t\t\t}\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnGibsSpawned\", list, creator);\n\treturn list;\n}\n",
      "ParametersText": "System.Collections.Generic.List`1[ServerGib] local0, UnityEngine.GameObject creator",
      "TargetName": "ServerGib",
      "MethodName": "CreateGibs",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3943117852,
      "Name": "OnBigWheelLoss",
      "FullName": "OnBigWheelLoss",
      "Category": "Entity",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when big wheel loss occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Payout()\n{\n\tHitNumber currentHitType = GetCurrentHitType();\n\tSystem.Guid value = System.Guid.NewGuid();\n\tforeach (BigWheelBettingTerminal terminal in terminals)\n\t{\n\t\tif (terminal.isClient || terminal == null || terminal.inventory == null)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tItem slot = terminal.inventory.GetSlot((int)currentHitType.hitType);\n\t\tif (slot != null)\n\t\t{\n\t\t\tint num = currentHitType.ColorToMultiplier(currentHitType.hitType);\n\t\t\tint amount = slot.amount;\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnBigWheelWin\", this, slot, terminal, num) == null)\n\t\t\t{\n\t\t\t\tslot.amount += slot.amount * num;\n\t\t\t\tslot.RemoveFromContainer();\n\t\t\t\tslot.MoveToContainer(terminal.inventory, 5);\n\t\t\t\tflag = true;\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnGamblingResult(terminal.lastPlayer, terminal, amount, slot.amount, value);\n\t\t\t}\n\t\t}\n\t\tfor (int i = 0; i < 5; i++)\n\t\t{\n\t\t\tItem slot2 = terminal.inventory.GetSlot(i);\n\t\t\tif (slot2 != null && Oxide.Core.Interface.CallHook(\"OnBigWheelLoss\", this, slot2, terminal) == null)\n\t\t\t{\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnGamblingResult(terminal.lastPlayer, terminal, slot2.amount, 0, value);\n\t\t\t\tslot2.Remove();\n\t\t\t\tflag2 = true;\n\t\t\t}\n\t\t}\n\t\tif (flag || flag2)\n\t\t{\n\t\t\tterminal.ClientRPC(RpcTarget.NetworkGroup(\"WinOrLoseSound\"), flag);\n\t\t}\n\t}\n\tItemManager.DoRemoves();\n\tSetTerminalsLocked(isLocked: false);\n}\n",
      "ParametersText": "",
      "TargetName": "BigWheelGame",
      "MethodName": "Payout",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4152527062,
      "Name": "OnBigWheelWin",
      "FullName": "OnBigWheelWin",
      "Category": "Entity",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when big wheel win occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Payout()\n{\n\tHitNumber currentHitType = GetCurrentHitType();\n\tSystem.Guid value = System.Guid.NewGuid();\n\tforeach (BigWheelBettingTerminal terminal in terminals)\n\t{\n\t\tif (terminal.isClient || terminal == null || terminal.inventory == null)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tItem slot = terminal.inventory.GetSlot((int)currentHitType.hitType);\n\t\tif (slot != null)\n\t\t{\n\t\t\tint num = currentHitType.ColorToMultiplier(currentHitType.hitType);\n\t\t\tint amount = slot.amount;\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnBigWheelWin\", this, slot, terminal, num) == null)\n\t\t\t{\n\t\t\t\tslot.amount += slot.amount * num;\n\t\t\t\tslot.RemoveFromContainer();\n\t\t\t\tslot.MoveToContainer(terminal.inventory, 5);\n\t\t\t\tflag = true;\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnGamblingResult(terminal.lastPlayer, terminal, amount, slot.amount, value);\n\t\t\t}\n\t\t}\n\t\tfor (int i = 0; i < 5; i++)\n\t\t{\n\t\t\tItem slot2 = terminal.inventory.GetSlot(i);\n\t\t\tif (slot2 != null && Oxide.Core.Interface.CallHook(\"OnBigWheelLoss\", this, slot2, terminal) == null)\n\t\t\t{\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnGamblingResult(terminal.lastPlayer, terminal, slot2.amount, 0, value);\n\t\t\t\tslot2.Remove();\n\t\t\t\tflag2 = true;\n\t\t\t}\n\t\t}\n\t\tif (flag || flag2)\n\t\t{\n\t\t\tterminal.ClientRPC(RpcTarget.NetworkGroup(\"WinOrLoseSound\"), flag);\n\t\t}\n\t}\n\tItemManager.DoRemoves();\n\tSetTerminalsLocked(isLocked: false);\n}\n",
      "ParametersText": "",
      "TargetName": "BigWheelGame",
      "MethodName": "Payout",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Player": [
    {
      "Id": 3081308902,
      "Name": "CanClientLogin",
      "FullName": "CanClientLogin",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called to determine whether to client login.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnUserApprove(Network.Connection connection)\n{\n\tstring username = connection.username;\n\tstring arg = connection.userid.ToString();\n\tstring arg2 = System.Text.RegularExpressions.Regex.Replace(connection.ipaddress, Oxide.Game.Rust.Libraries.Player.ipPattern, string.Empty);\n\tobject obj = Carbon.HookCaller.CallStaticHook(3081308902u, connection);\n\tobject obj2 = Carbon.HookCaller.CallStaticHook(1045800646u, username, arg, arg2);\n\tobject obj3 = ((obj == null) ? obj2 : obj);\n\tif (obj3 is string || (obj3 is bool flag && !flag))\n\t{\n\t\tConnectionAuth.Reject(connection, (obj3 is string) ? obj3.ToString() : \"Connection was rejected\");\n\t\treturn Carbon.Cache.True;\n\t}\n\tif (Carbon.HookCaller.CallStaticHook(2666432541u, connection) != null)\n\t{\n\t\treturn Carbon.HookCaller.CallStaticHook(1330253375u, username, arg, arg2);\n\t}\n\treturn null;\n}\n",
      "ParametersText": "Network.Connection connection",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnUserApprove",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1045800646,
      "Name": "CanUserLogin",
      "FullName": "CanUserLogin",
      "Category": "Player",
      "Parameters": [
        {
          "name": "username",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "userid",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "ip",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called to determine whether to user login.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnUserApprove(Network.Connection connection)\n{\n\tstring username = connection.username;\n\tstring arg = connection.userid.ToString();\n\tstring arg2 = System.Text.RegularExpressions.Regex.Replace(connection.ipaddress, Oxide.Game.Rust.Libraries.Player.ipPattern, string.Empty);\n\tobject obj = Carbon.HookCaller.CallStaticHook(3081308902u, connection);\n\tobject obj2 = Carbon.HookCaller.CallStaticHook(1045800646u, username, arg, arg2);\n\tobject obj3 = ((obj == null) ? obj2 : obj);\n\tif (obj3 is string || (obj3 is bool flag && !flag))\n\t{\n\t\tConnectionAuth.Reject(connection, (obj3 is string) ? obj3.ToString() : \"Connection was rejected\");\n\t\treturn Carbon.Cache.True;\n\t}\n\tif (Carbon.HookCaller.CallStaticHook(2666432541u, connection) != null)\n\t{\n\t\treturn Carbon.HookCaller.CallStaticHook(1330253375u, username, arg, arg2);\n\t}\n\treturn null;\n}\n",
      "ParametersText": "string username, string userid, string ip",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnUserApprove",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 338697635,
      "Name": "OnCarbonBanPlayer",
      "FullName": "OnCarbonBanPlayer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "expiry",
          "typeName": "System.Int64",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when carbon ban player occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void BanPlayer(BasePlayer player, BasePlayer target, string reason = \"No reason given\", string duration = \"\")\n{\n\tSystem.TimeSpan timeSpan = System.TimeSpan.Zero;\n\tif (!string.IsNullOrEmpty(duration))\n\t{\n\t\ttimeSpan = BanStringToSeconds(duration);\n\t}\n\tlong expiry = -1L;\n\tif (timeSpan != System.TimeSpan.Zero)\n\t{\n\t\texpiry = new System.DateTimeOffset(System.DateTime.UtcNow.Add(timeSpan)).ToUnixTimeSeconds();\n\t}\n\tServerUsers.Set(target.userID, ServerUsers.UserGroup.Banned, target.displayName, reason, expiry);\n\tServerUsers.Save();\n\tCarbon.HookCaller.CallStaticHook(338697635u, player, target, reason, timeSpan);\n\tKickPlayer(player, target, reason);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target, string reason, System.Int64 expiry",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "BanPlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3658185574,
      "Name": "OnCarbonBlinded",
      "FullName": "OnCarbonBlinded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a carbon is blinded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void BlindPlayer(BasePlayer player, BasePlayer target)\n{\n\tusing Carbon.Components.CUI cUI = new Carbon.Components.CUI(Singleton.Handler);\n\tCarbon.Components.LUI.LuiContainer container = cUI.v2.CreateParent(Carbon.Components.CUI.ClientPanels.Overlay, Carbon.Components.LuiPosition.Full, \"blindingpanel\").AddCursor().AddKeyboard()\n\t\t.SetDestroy(\"blindingpanel\");\n\tcUI.v2.CreateImageFromDb(container, Carbon.Components.LuiPosition.Full, Carbon.Components.LuiOffset.None, \"bsod\", \"0 0 0 1\");\n\tCarbon.Modules.AdminModule.PlayersTab.BlindedPlayers.Add(target);\n\tcUI.v2.SendUi(target);\n\tCarbon.HookCaller.CallStaticHook(3658185574u, player, target);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "BlindPlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 837777771,
      "Name": "OnCarbonEmpowerPlayerStats",
      "FullName": "OnCarbonEmpowerPlayerStats",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when carbon empower player stats occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void EmpowerPlayerStats(BasePlayer player, BasePlayer target)\n{\n\tConVar.Debugging.RefillPlayerVitals(target, shouldPlayerRecover: true);\n\tCarbon.HookCaller.CallStaticHook(837777771u, player, target);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "EmpowerPlayerStats",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3987303153,
      "Name": "OnCarbonKickPlayer",
      "FullName": "OnCarbonKickPlayer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when carbon kick player occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void KickPlayer(BasePlayer player, BasePlayer target, string reason = \"No reason given\")\n{\n\ttarget.Kick(reason, reserveSlot: false);\n\tCarbon.HookCaller.CallStaticHook(3987303153u, player, target, reason);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target, string reason",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "KickPlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 298795244,
      "Name": "OnCarbonLockPlayerContainer",
      "FullName": "OnCarbonLockPlayerContainer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "container",
          "typeName": "ItemContainer",
          "optional": false
        },
        {
          "name": "locked",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void LockPlayerContainer(BasePlayer player, BasePlayer target, ItemContainer container, bool wants)\n{\n\tcontainer.SetLocked(wants);\n\tCarbon.HookCaller.CallStaticHook(298795244u, player, target, container, wants);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target, ItemContainer container, bool locked",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "LockPlayerContainer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2716457321,
      "Name": "OnCarbonMutePlayer",
      "FullName": "OnCarbonMutePlayer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "wants",
          "typeName": "System.Boolean",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when carbon mute player occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void MutePlayer(BasePlayer player, BasePlayer target, bool wants, string reason = \"No reason given\")\n{\n\ttarget.State.chatMuted = wants;\n\ttarget.SetPlayerFlag(BasePlayer.PlayerFlags.ChatMute, wants);\n\ttarget.DirtyPlayerState();\n\ttarget.ChatMessage(\"You have been \" + (wants ? \"muted\" : \"unmuted\") + \" by an admin. Reason: \" + reason);\n\tCarbon.HookCaller.CallStaticHook(2716457321u, player, target, wants, reason);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target, bool wants, string reason",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "MutePlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 468227819,
      "Name": "OnCarbonPrivateMessage",
      "FullName": "OnCarbonPrivateMessage",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "message",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a carbon private is received."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void PrivateMessagePlayer(BasePlayer player, BasePlayer target, string message)\n{\n\tif (!string.IsNullOrEmpty(message))\n\t{\n\t\ttarget.ChatMessage(\"[\" + player.displayName + \"]: \" + message);\n\t\tif (Singleton.ConfigInstance.PlayPMSound)\n\t\t{\n\t\t\tEffect.server.Run(Singleton.ConfigInstance.PMSound, target, 2u, UnityEngine.Vector3.zero, new UnityEngine.Vector3(0f, 2f, 0f));\n\t\t}\n\t\tCarbon.HookCaller.CallStaticHook(468227819u, player, target, message);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BasePlayer target, string message",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "PrivateMessagePlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2609635685,
      "Name": "OnCarbonSpectateEnd",
      "FullName": "OnCarbonSpectateEnd",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "",
      "ParametersText": "BasePlayer player, BasePlayer target",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "StopSpectating",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 597991647,
      "Name": "OnCarbonSpectateStart",
      "FullName": "OnCarbonSpectateStart",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a carbon spectate starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "",
      "ParametersText": "BasePlayer player, BasePlayer target",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "StartSpectating",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1355418005,
      "Name": "OnCarbonUnbanPlayer",
      "FullName": "OnCarbonUnbanPlayer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when carbon unban player occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void UnbanPlayer(BasePlayer player, BasePlayer target)\n{\n\tServerUsers.Remove(target.userID);\n\tServerUsers.Save();\n\tCarbon.HookCaller.CallStaticHook(1355418005u, player, target);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "UnbanPlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3911772319,
      "Name": "OnCarbonUnblinded",
      "FullName": "OnCarbonUnblinded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "invoker",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "target",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a carbon is unblinded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "public static void UnblindPlayer(BasePlayer player, BasePlayer target)\n{\n\tif (!Carbon.Modules.AdminModule.PlayersTab.BlindedPlayers.Remove(target))\n\t{\n\t\treturn;\n\t}\n\tusing Carbon.Components.CUI cUI = new Carbon.Components.CUI(Singleton.Handler);\n\tcUI.Destroy(\"blindingpanel\", target);\n\tCarbon.HookCaller.CallStaticHook(3911772319u, player, target);\n}\n",
      "ParametersText": "BasePlayer invoker, BasePlayer target",
      "TargetName": "Carbon.Modules.AdminModule",
      "MethodName": "UnblindPlayer",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 140408349,
      "Name": "OnPlayerBanned",
      "FullName": "OnPlayerBanned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a player is banned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnPlayerBanned(Network.Connection connection, AuthResponse status)\n{\n\tCarbon.HookCaller.CallStaticHook(140408349u, connection, status.ToString());\n\treturn null;\n}\n",
      "ParametersText": "Network.Connection connection, string reason",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerBanned",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2032160890,
      "Name": "OnPlayerChat",
      "FullName": "OnPlayerChat",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "message",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "channel",
          "typeName": "ConVar.Chat+ChatChannel",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a player chats."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static object IOnPlayerChat(ulong playerId, string playerName, ref string message, ConVar.Chat.ChatChannel channel, BasePlayer basePlayer)\n{\n\tif (string.IsNullOrEmpty(message) || message.Equals(\"text\"))\n\t{\n\t\treturn Carbon.Cache.True;\n\t}\n\tmessage = UnityEngine.StringEx.EscapeRichText(message);\n\tif (basePlayer == null || !basePlayer.IsConnected)\n\t{\n\t\treturn Carbon.HookCaller.CallStaticHook(4068177051u, playerId, playerName, message, channel);\n\t}\n\tobject obj = Carbon.HookCaller.CallStaticHook(2032160890u, basePlayer, message, channel);\n\tobject obj2 = Carbon.HookCaller.CallStaticHook(2894159933u, basePlayer.AsIPlayer(), message);\n\treturn obj ?? obj2;\n}\n",
      "ParametersText": "BasePlayer player, string message, ConVar.Chat.ChatChannel channel",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerChat",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2915735597,
      "Name": "OnPlayerCommand",
      "FullName": "OnPlayerCommand",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "command",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "args",
          "typeName": "System.String[]",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static object IOnPlayerCommand(BasePlayer player, string message, API.Commands.Command.Prefix prefix)\n{\n\tif (Carbon.Community.Runtime == null)\n\t{\n\t\treturn Carbon.Cache.True;\n\t}\n\ttry\n\t{\n\t\tif (!Carbon.Extensions.ConsoleArgEx.TryParseCommand(System.MemoryExtensions.AsSpan(message).Slice(prefix.Value.Length), out var command, out var args))\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2198880635u, player, command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2198880635u, player.AsIPlayer(), command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2915735597u, player, command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.Community.Runtime.CommandManager.Contains(Carbon.Community.Runtime.CommandManager.Chat, command, out var outCommand))\n\t\t{\n\t\t\tAPI.Commands.PlayerArgs obj = Facepunch.Pool.Get<API.Commands.PlayerArgs>();\n\t\t\tobj.Type = outCommand.Type;\n\t\t\tobj.Arguments = args;\n\t\t\tobj.Player = player;\n\t\t\tobj.PrintOutput = true;\n\t\t\tCarbon.Community.Runtime.CommandManager.Execute(outCommand, obj);\n\t\t\tFacepunch.Pool.Free(ref obj);\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (player.Connection.authLevel < prefix.SuggestionAuthLevel)\n\t\t{\n\t\t\tgoto IL_027e;\n\t\t}\n\t\tSystem.Collections.Generic.IEnumerable<Carbon.Components.Suggestions.SuggestionResult> source = Carbon.Components.Suggestions.Lookup(command, System.Linq.Enumerable.Select(Carbon.Community.Runtime.CommandManager.Chat, (API.Commands.Command x) => x.Name), 3, 5);\n\t\tif (!System.Linq.Enumerable.Any(source))\n\t\t{\n\t\t\tgoto IL_027e;\n\t\t}\n\t\tCarbon.Core.CorePlugin core = Carbon.Community.Runtime.Core;\n\t\tstring message2 = core.lang.GetMessage(\"unknown_chat_cmd_2\", core, player.UserIDString);\n\t\tstring message3 = core.lang.GetMessage(\"unknown_chat_cmd_separator_1\", core, player.UserIDString);\n\t\tstring message4 = core.lang.GetMessage(\"unknown_chat_cmd_separator_2\", core, player.UserIDString);\n\t\tstring text = string.Format(message2, message, Carbon.Extensions.StringArrayEx.ToString(System.Linq.Enumerable.Select(source, (Carbon.Components.Suggestions.SuggestionResult x) => prefix.Value + x.Result), message3, message4));\n\t\tplayer.SendConsoleCommand(\"chat.add\", 2, Carbon.Community.Runtime.Core.DefaultServerChatId, text);\n\t\tgoto end_IL_0026;\n\t\tIL_027e:\n\t\tCarbon.Core.CorePlugin core2 = Carbon.Community.Runtime.Core;\n\t\tstring message5 = core2.lang.GetMessage(\"unknown_chat_cmd_1\", core2, player.UserIDString);\n\t\tstring text2 = string.Format(message5, message);\n\t\tplayer.SendConsoleCommand(\"chat.add\", 2, Carbon.Community.Runtime.Core.DefaultServerChatId, text2);\n\t\tend_IL_0026:;\n\t}\n\tcatch (System.Exception ex)\n\t{\n\t\tCarbon.Logger.Error(\"Failed IOnPlayerCommand.\", ex);\n\t}\n\treturn Carbon.Cache.False;\n}\n",
      "ParametersText": "BasePlayer player, string command, string[] args",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerCommand",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "object"
    },
    {
      "Id": 2848347654,
      "Name": "OnPlayerConnected",
      "FullName": "OnPlayerConnected",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnPlayerConnected(BasePlayer player)\n{\n\tCarbon.Core.CorePlugin corePlugin = Oxide.Plugins.RustPlugin.Singleton<Carbon.Core.CorePlugin>();\n\tplayer.SendEntitySnapshot((BaseNetworkable)CommunityEntity.ServerInstance);\n\tcorePlugin.permission.RefreshUser(player);\n\tCarbon.HookCaller.CallStaticHook(2848347654u, player);\n\tCarbon.HookCaller.CallStaticHook(1253832323u, player.AsIPlayer());\n\tCarbon.Components.CustomVitalManager.SendVitals(player);\n\treturn null;\n}\n",
      "ParametersText": "BasePlayer player",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerConnected",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1945313578,
      "Name": "OnPlayerLanguageChanged",
      "FullName": "OnPlayerLanguageChanged [BasePlayer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "var",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a player language is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnPlayerSetInfo(Network.Connection connection, string key, string val)\n{\n\tif (key == \"global.language\")\n\t{\n\t\tlang.SetLanguage(val, connection.userid.ToString());\n\t\tif (connection.player is BasePlayer basePlayer)\n\t\t{\n\t\t\tCarbon.HookCaller.CallStaticHook(1945313578u, basePlayer, val);\n\t\t\tCarbon.HookCaller.CallStaticHook(1945313578u, basePlayer.AsIPlayer(), val);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer player, string var",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerSetInfo",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1945313578,
      "Name": "OnPlayerLanguageChanged",
      "FullName": "OnPlayerLanguageChanged [IPlayer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        },
        {
          "name": "var",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a player language is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnPlayerSetInfo(Network.Connection connection, string key, string val)\n{\n\tif (key == \"global.language\")\n\t{\n\t\tlang.SetLanguage(val, connection.userid.ToString());\n\t\tif (connection.player is BasePlayer basePlayer)\n\t\t{\n\t\t\tCarbon.HookCaller.CallStaticHook(1945313578u, basePlayer, val);\n\t\t\tCarbon.HookCaller.CallStaticHook(1945313578u, basePlayer.AsIPlayer(), val);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player, string var",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerSetInfo",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4068177051,
      "Name": "OnPlayerOfflineChat",
      "FullName": "OnPlayerOfflineChat",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerid",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "username",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "message",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "channel",
          "typeName": "ConVar.Chat+ChatChannel",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a player offline chats."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "ulong playerid, string username, string message, ConVar.Chat.ChatChannel channel",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerOfflineChat",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1455743240,
      "Name": "OnPlayerUnbanned",
      "FullName": "OnPlayerUnbanned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "steamId",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "address",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a player is unbanned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnServerUserRemove(ulong steamId)\n{\n\tif (Carbon.Community.IsServerInitialized && ServerUsers.users.ContainsKey(steamId) && ServerUsers.users[steamId].group == ServerUsers.UserGroup.Banned)\n\t{\n\t\tstring arg = steamId.ToString();\n\t\tOxide.Game.Rust.Libraries.Covalence.RustPlayer rustPlayer = BasePlayer.FindByID(steamId)?.AsIPlayer();\n\t\tCarbon.HookCaller.CallStaticHook(1455743240u, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Name)) ? \"Unnamed\" : rustPlayer.Name, steamId, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Address)) ? \"0\" : rustPlayer.Address);\n\t\tCarbon.HookCaller.CallStaticHook(339730350u, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Name)) ? \"Unnamed\" : rustPlayer.Name, arg, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Address)) ? \"0\" : rustPlayer.Address);\n\t}\n}\n",
      "ParametersText": "string playerName, ulong steamId, string address",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnServerUserRemove",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2666432541,
      "Name": "OnUserApprove",
      "FullName": "OnUserApprove",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when user approve occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnUserApprove(Network.Connection connection)\n{\n\tstring username = connection.username;\n\tstring arg = connection.userid.ToString();\n\tstring arg2 = System.Text.RegularExpressions.Regex.Replace(connection.ipaddress, Oxide.Game.Rust.Libraries.Player.ipPattern, string.Empty);\n\tobject obj = Carbon.HookCaller.CallStaticHook(3081308902u, connection);\n\tobject obj2 = Carbon.HookCaller.CallStaticHook(1045800646u, username, arg, arg2);\n\tobject obj3 = ((obj == null) ? obj2 : obj);\n\tif (obj3 is string || (obj3 is bool flag && !flag))\n\t{\n\t\tConnectionAuth.Reject(connection, (obj3 is string) ? obj3.ToString() : \"Connection was rejected\");\n\t\treturn Carbon.Cache.True;\n\t}\n\tif (Carbon.HookCaller.CallStaticHook(2666432541u, connection) != null)\n\t{\n\t\treturn Carbon.HookCaller.CallStaticHook(1330253375u, username, arg, arg2);\n\t}\n\treturn null;\n}\n",
      "ParametersText": "Network.Connection connection",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnUserApprove",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1330253375,
      "Name": "OnUserApproved",
      "FullName": "OnUserApproved",
      "Category": "Player",
      "Parameters": [
        {
          "name": "username",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "userid",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "ip",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user is approved."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnUserApprove(Network.Connection connection)\n{\n\tstring username = connection.username;\n\tstring arg = connection.userid.ToString();\n\tstring arg2 = System.Text.RegularExpressions.Regex.Replace(connection.ipaddress, Oxide.Game.Rust.Libraries.Player.ipPattern, string.Empty);\n\tobject obj = Carbon.HookCaller.CallStaticHook(3081308902u, connection);\n\tobject obj2 = Carbon.HookCaller.CallStaticHook(1045800646u, username, arg, arg2);\n\tobject obj3 = ((obj == null) ? obj2 : obj);\n\tif (obj3 is string || (obj3 is bool flag && !flag))\n\t{\n\t\tConnectionAuth.Reject(connection, (obj3 is string) ? obj3.ToString() : \"Connection was rejected\");\n\t\treturn Carbon.Cache.True;\n\t}\n\tif (Carbon.HookCaller.CallStaticHook(2666432541u, connection) != null)\n\t{\n\t\treturn Carbon.HookCaller.CallStaticHook(1330253375u, username, arg, arg2);\n\t}\n\treturn null;\n}\n",
      "ParametersText": "string username, string userid, string ip",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnUserApprove",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3042565959,
      "Name": "OnUserBanned",
      "FullName": "OnUserBanned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "playerId",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "address",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "expiry",
          "typeName": "System.Int64",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user is banned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnServerUserSet(ulong steamId, ServerUsers.UserGroup group, string playerName, string reason, long expiry)\n{\n\tif (Carbon.Community.IsServerInitialized && group == ServerUsers.UserGroup.Banned)\n\t{\n\t\tstring arg = steamId.ToString();\n\t\tOxide.Game.Rust.Libraries.Covalence.RustPlayer rustPlayer = BasePlayer.FindByID(steamId)?.AsIPlayer();\n\t\tCarbon.HookCaller.CallStaticHook(140408349u, playerName, steamId, (rustPlayer == null) ? \"0\" : rustPlayer.Address, reason, expiry);\n\t\tCarbon.HookCaller.CallStaticHook(3042565959u, playerName, arg, (rustPlayer == null) ? \"0\" : rustPlayer.Address, reason, expiry);\n\t}\n}\n",
      "ParametersText": "string playerName, string playerId, string address, string reason, System.Int64 expiry",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnServerUserSet",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2894159933,
      "Name": "OnUserChat",
      "FullName": "OnUserChat",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        },
        {
          "name": "message",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user chats."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static object IOnPlayerChat(ulong playerId, string playerName, ref string message, ConVar.Chat.ChatChannel channel, BasePlayer basePlayer)\n{\n\tif (string.IsNullOrEmpty(message) || message.Equals(\"text\"))\n\t{\n\t\treturn Carbon.Cache.True;\n\t}\n\tmessage = UnityEngine.StringEx.EscapeRichText(message);\n\tif (basePlayer == null || !basePlayer.IsConnected)\n\t{\n\t\treturn Carbon.HookCaller.CallStaticHook(4068177051u, playerId, playerName, message, channel);\n\t}\n\tobject obj = Carbon.HookCaller.CallStaticHook(2032160890u, basePlayer, message, channel);\n\tobject obj2 = Carbon.HookCaller.CallStaticHook(2894159933u, basePlayer.AsIPlayer(), message);\n\treturn obj ?? obj2;\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player, string message",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerChat",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2198880635,
      "Name": "OnUserCommand",
      "FullName": "OnUserCommand",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "command",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "args",
          "typeName": "System.String[]",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static object IOnPlayerCommand(BasePlayer player, string message, API.Commands.Command.Prefix prefix)\n{\n\tif (Carbon.Community.Runtime == null)\n\t{\n\t\treturn Carbon.Cache.True;\n\t}\n\ttry\n\t{\n\t\tif (!Carbon.Extensions.ConsoleArgEx.TryParseCommand(System.MemoryExtensions.AsSpan(message).Slice(prefix.Value.Length), out var command, out var args))\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2198880635u, player, command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2198880635u, player.AsIPlayer(), command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2915735597u, player, command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.Community.Runtime.CommandManager.Contains(Carbon.Community.Runtime.CommandManager.Chat, command, out var outCommand))\n\t\t{\n\t\t\tAPI.Commands.PlayerArgs obj = Facepunch.Pool.Get<API.Commands.PlayerArgs>();\n\t\t\tobj.Type = outCommand.Type;\n\t\t\tobj.Arguments = args;\n\t\t\tobj.Player = player;\n\t\t\tobj.PrintOutput = true;\n\t\t\tCarbon.Community.Runtime.CommandManager.Execute(outCommand, obj);\n\t\t\tFacepunch.Pool.Free(ref obj);\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (player.Connection.authLevel < prefix.SuggestionAuthLevel)\n\t\t{\n\t\t\tgoto IL_027e;\n\t\t}\n\t\tSystem.Collections.Generic.IEnumerable<Carbon.Components.Suggestions.SuggestionResult> source = Carbon.Components.Suggestions.Lookup(command, System.Linq.Enumerable.Select(Carbon.Community.Runtime.CommandManager.Chat, (API.Commands.Command x) => x.Name), 3, 5);\n\t\tif (!System.Linq.Enumerable.Any(source))\n\t\t{\n\t\t\tgoto IL_027e;\n\t\t}\n\t\tCarbon.Core.CorePlugin core = Carbon.Community.Runtime.Core;\n\t\tstring message2 = core.lang.GetMessage(\"unknown_chat_cmd_2\", core, player.UserIDString);\n\t\tstring message3 = core.lang.GetMessage(\"unknown_chat_cmd_separator_1\", core, player.UserIDString);\n\t\tstring message4 = core.lang.GetMessage(\"unknown_chat_cmd_separator_2\", core, player.UserIDString);\n\t\tstring text = string.Format(message2, message, Carbon.Extensions.StringArrayEx.ToString(System.Linq.Enumerable.Select(source, (Carbon.Components.Suggestions.SuggestionResult x) => prefix.Value + x.Result), message3, message4));\n\t\tplayer.SendConsoleCommand(\"chat.add\", 2, Carbon.Community.Runtime.Core.DefaultServerChatId, text);\n\t\tgoto end_IL_0026;\n\t\tIL_027e:\n\t\tCarbon.Core.CorePlugin core2 = Carbon.Community.Runtime.Core;\n\t\tstring message5 = core2.lang.GetMessage(\"unknown_chat_cmd_1\", core2, player.UserIDString);\n\t\tstring text2 = string.Format(message5, message);\n\t\tplayer.SendConsoleCommand(\"chat.add\", 2, Carbon.Community.Runtime.Core.DefaultServerChatId, text2);\n\t\tend_IL_0026:;\n\t}\n\tcatch (System.Exception ex)\n\t{\n\t\tCarbon.Logger.Error(\"Failed IOnPlayerCommand.\", ex);\n\t}\n\treturn Carbon.Cache.False;\n}\n",
      "ParametersText": "BasePlayer player, string command, string[] args",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerCommand",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "object"
    },
    {
      "Id": 2198880635,
      "Name": "OnUserCommand",
      "FullName": "OnUserCommand [1]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        },
        {
          "name": "command",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "args",
          "typeName": "System.String[]",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static object IOnPlayerCommand(BasePlayer player, string message, API.Commands.Command.Prefix prefix)\n{\n\tif (Carbon.Community.Runtime == null)\n\t{\n\t\treturn Carbon.Cache.True;\n\t}\n\ttry\n\t{\n\t\tif (!Carbon.Extensions.ConsoleArgEx.TryParseCommand(System.MemoryExtensions.AsSpan(message).Slice(prefix.Value.Length), out var command, out var args))\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2198880635u, player, command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2198880635u, player.AsIPlayer(), command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.HookCaller.CallStaticHook(2915735597u, player, command, args) != null)\n\t\t{\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (Carbon.Community.Runtime.CommandManager.Contains(Carbon.Community.Runtime.CommandManager.Chat, command, out var outCommand))\n\t\t{\n\t\t\tAPI.Commands.PlayerArgs obj = Facepunch.Pool.Get<API.Commands.PlayerArgs>();\n\t\t\tobj.Type = outCommand.Type;\n\t\t\tobj.Arguments = args;\n\t\t\tobj.Player = player;\n\t\t\tobj.PrintOutput = true;\n\t\t\tCarbon.Community.Runtime.CommandManager.Execute(outCommand, obj);\n\t\t\tFacepunch.Pool.Free(ref obj);\n\t\t\treturn Carbon.Cache.False;\n\t\t}\n\t\tif (player.Connection.authLevel < prefix.SuggestionAuthLevel)\n\t\t{\n\t\t\tgoto IL_027e;\n\t\t}\n\t\tSystem.Collections.Generic.IEnumerable<Carbon.Components.Suggestions.SuggestionResult> source = Carbon.Components.Suggestions.Lookup(command, System.Linq.Enumerable.Select(Carbon.Community.Runtime.CommandManager.Chat, (API.Commands.Command x) => x.Name), 3, 5);\n\t\tif (!System.Linq.Enumerable.Any(source))\n\t\t{\n\t\t\tgoto IL_027e;\n\t\t}\n\t\tCarbon.Core.CorePlugin core = Carbon.Community.Runtime.Core;\n\t\tstring message2 = core.lang.GetMessage(\"unknown_chat_cmd_2\", core, player.UserIDString);\n\t\tstring message3 = core.lang.GetMessage(\"unknown_chat_cmd_separator_1\", core, player.UserIDString);\n\t\tstring message4 = core.lang.GetMessage(\"unknown_chat_cmd_separator_2\", core, player.UserIDString);\n\t\tstring text = string.Format(message2, message, Carbon.Extensions.StringArrayEx.ToString(System.Linq.Enumerable.Select(source, (Carbon.Components.Suggestions.SuggestionResult x) => prefix.Value + x.Result), message3, message4));\n\t\tplayer.SendConsoleCommand(\"chat.add\", 2, Carbon.Community.Runtime.Core.DefaultServerChatId, text);\n\t\tgoto end_IL_0026;\n\t\tIL_027e:\n\t\tCarbon.Core.CorePlugin core2 = Carbon.Community.Runtime.Core;\n\t\tstring message5 = core2.lang.GetMessage(\"unknown_chat_cmd_1\", core2, player.UserIDString);\n\t\tstring text2 = string.Format(message5, message);\n\t\tplayer.SendConsoleCommand(\"chat.add\", 2, Carbon.Community.Runtime.Core.DefaultServerChatId, text2);\n\t\tend_IL_0026:;\n\t}\n\tcatch (System.Exception ex)\n\t{\n\t\tCarbon.Logger.Error(\"Failed IOnPlayerCommand.\", ex);\n\t}\n\treturn Carbon.Cache.False;\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player, string command, string[] args",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerCommand",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "object"
    },
    {
      "Id": 1253832323,
      "Name": "OnUserConnected",
      "FullName": "OnUserConnected",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnPlayerConnected(BasePlayer player)\n{\n\tCarbon.Core.CorePlugin corePlugin = Oxide.Plugins.RustPlugin.Singleton<Carbon.Core.CorePlugin>();\n\tplayer.SendEntitySnapshot((BaseNetworkable)CommunityEntity.ServerInstance);\n\tcorePlugin.permission.RefreshUser(player);\n\tCarbon.HookCaller.CallStaticHook(2848347654u, player);\n\tCarbon.HookCaller.CallStaticHook(1253832323u, player.AsIPlayer());\n\tCarbon.Components.CustomVitalManager.SendVitals(player);\n\treturn null;\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnPlayerConnected",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 649612044,
      "Name": "OnUserDisconnected",
      "FullName": "OnUserDisconnected",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user disconnects."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnPlayerDisconnected(BasePlayer player, string reason)\n{\n\tCarbon.HookCaller.CallStaticHook(649612044u, player?.AsIPlayer(), reason);\n\tif (!player.IsAdmin || player.IsOnGround())\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 position = player.transform.position;\n\tif (!UnityEngine.Physics.Raycast(position, UnityEngine.Vector3.down, out var hitInfo, float.MaxValue, -1, UnityEngine.QueryTriggerInteraction.Ignore))\n\t{\n\t\treturn;\n\t}\n\tposition.y = hitInfo.point.y;\n\tif (!(UnityEngine.Vector3.Distance(player.transform.position, position) > 3.5f))\n\t{\n\t\treturn;\n\t}\n\tplayer.SetServerFall(wantsOn: false);\n\tplayer.Teleport(position);\n\tplayer.estimatedVelocity = UnityEngine.Vector3.zero;\n\tNextFrame(delegate\n\t{\n\t\tif (player != null)\n\t\t{\n\t\t\tplayer.SetServerFall(wantsOn: true);\n\t\t}\n\t});\n\tCarbon.Logger.Warn($\"Moved admin player {player.net.connection} on the object underneath so it doesn't die from fall damage.\");\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player, string reason",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerDisconnected",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3928650942,
      "Name": "OnUserKicked",
      "FullName": "OnUserKicked",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user is kicked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnPlayerKicked(BasePlayer basePlayer, string reason)\n{\n\tCarbon.HookCaller.CallStaticHook(3928650942u, basePlayer.AsIPlayer(), reason);\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player, string reason",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerKicked",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3398288406,
      "Name": "OnUserRespawn",
      "FullName": "OnUserRespawn",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user respawns."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private object OnPlayerRespawn(BasePlayer basePlayer)\n{\n\treturn Carbon.HookCaller.CallStaticHook(3398288406u, basePlayer.AsIPlayer());\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerRespawn",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 960522643,
      "Name": "OnUserRespawned",
      "FullName": "OnUserRespawned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "Oxide.Core.Libraries.Covalence.IPlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user is respawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnPlayerRespawned(BasePlayer basePlayer)\n{\n\tCarbon.HookCaller.CallStaticHook(960522643u, basePlayer.AsIPlayer());\n}\n",
      "ParametersText": "Oxide.Core.Libraries.Covalence.IPlayer player",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnPlayerRespawned",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 339730350,
      "Name": "OnUserUnbanned",
      "FullName": "OnUserUnbanned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerName",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "playerId",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "address",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when an user is unbanned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnServerUserRemove(ulong steamId)\n{\n\tif (Carbon.Community.IsServerInitialized && ServerUsers.users.ContainsKey(steamId) && ServerUsers.users[steamId].group == ServerUsers.UserGroup.Banned)\n\t{\n\t\tstring arg = steamId.ToString();\n\t\tOxide.Game.Rust.Libraries.Covalence.RustPlayer rustPlayer = BasePlayer.FindByID(steamId)?.AsIPlayer();\n\t\tCarbon.HookCaller.CallStaticHook(1455743240u, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Name)) ? \"Unnamed\" : rustPlayer.Name, steamId, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Address)) ? \"0\" : rustPlayer.Address);\n\t\tCarbon.HookCaller.CallStaticHook(339730350u, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Name)) ? \"Unnamed\" : rustPlayer.Name, arg, (rustPlayer == null || string.IsNullOrEmpty(rustPlayer.Address)) ? \"0\" : rustPlayer.Address);\n\t}\n}\n",
      "ParametersText": "string playerName, string playerId, string address",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "OnServerUserRemove",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1879512085,
      "Name": "OnWireClear",
      "FullName": "OnWireClear",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "ioA",
          "typeName": "IOEntity",
          "optional": false
        },
        {
          "name": "clearIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "ioB",
          "typeName": "IOEntity",
          "optional": false
        },
        {
          "name": "isInput",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when wire clear occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool AttemptClearSlot(BaseNetworkable clearEnt, BasePlayer ply, int clearIndex, bool isInput)\n{\n\tIOEntity iOEntity = ((clearEnt != null) ? clearEnt.GetComponent<IOEntity>() : null);\n\tIOEntity iOEntity2 = (IOEntity)(object)(isInput ? iOEntity.inputs[clearIndex] : iOEntity.outputs[clearIndex]);\n\tif (((IOEntity.IOSlot)(object)iOEntity2).connectedTo.Get() == null)\n\t{\n\t\treturn false;\n\t}\n\tiOEntity2 = ((IOEntity.IOSlot)(object)iOEntity2).connectedTo.Get();\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnWireClear\", ply, iOEntity, clearIndex, iOEntity2, isInput);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (iOEntity == null)\n\t{\n\t\treturn false;\n\t}\n\tif (ply != null && !CanModifyEntity(ply, iOEntity))\n\t{\n\t\treturn false;\n\t}\n\treturn iOEntity.Disconnect(clearIndex, isInput);\n}\n",
      "ParametersText": "BasePlayer player, IOEntity ioA, int clearIndex, IOEntity ioB, bool isInput",
      "TargetName": "WireTool",
      "MethodName": "AttemptClearSlot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 72085565,
      "Name": "OnPlayerDisconnected",
      "FullName": "OnPlayerDisconnected",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "strReason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player disconnects."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnDisconnected(string strReason, Network.Connection connection)\n{\n\tFacepunch.Rust.Analytics.Azure.OnPlayerDisconnected(connection, strReason);\n\tGlobalNetworkHandler.server.OnClientDisconnected(connection);\n\tconnectionQueue.TryAddReservedSlot(connection);\n\tconnectionQueue.RemoveConnection(connection);\n\tConnectionAuth.OnDisconnect(connection);\n\tif (connection.authStatusSteam == \"ok\")\n\t{\n\t\tPlatformService.Instance.EndPlayerSession(connection.userid);\n\t}\n\tEACServer.OnLeaveGame(connection);\n\tBasePlayer basePlayer = connection.player as BasePlayer;\n\tif (basePlayer != null)\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerDisconnected\", basePlayer, strReason);\n\t\tbasePlayer.OnDisconnected();\n\t}\n\tif (connection.authStatusNexus == \"ok\")\n\t{\n\t\tNexusServer.Logout(connection.userid);\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, string strReason",
      "TargetName": "ServerMgr",
      "MethodName": "OnDisconnected",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2263673102,
      "Name": "OnClientAuth",
      "FullName": "OnClientAuth",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when client auth occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnGiveUserInformation(Network.Message packet)\n{\n\tif (packet.connection.state != 0)\n\t{\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Invalid connection state\");\n\t\treturn;\n\t}\n\tpacket.connection.state = Network.Connection.State.Connecting;\n\tif (packet.read.UInt8() != 228)\n\t{\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Invalid Connection Protocol\");\n\t\treturn;\n\t}\n\tpacket.connection.userid = packet.read.UInt64();\n\tpacket.connection.protocol = packet.read.UInt32();\n\tpacket.connection.os = packet.read.String(128);\n\tpacket.connection.username = packet.read.String();\n\tif (string.IsNullOrEmpty(packet.connection.os))\n\t{\n\t\tthrow new System.Exception(\"Invalid OS\");\n\t}\n\tif (string.IsNullOrEmpty(packet.connection.username))\n\t{\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Invalid Username\");\n\t\treturn;\n\t}\n\tpacket.connection.username = packet.connection.username.Replace('\\n', ' ').Replace('\\r', ' ').Replace('\\t', ' ')\n\t\t.Trim();\n\tif (string.IsNullOrEmpty(packet.connection.username))\n\t{\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Invalid Username\");\n\t\treturn;\n\t}\n\tstring text = string.Empty;\n\tstring branch = ConVar.Server.branch;\n\tif (packet.read.Unread >= 4)\n\t{\n\t\ttext = packet.read.String(128);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnClientAuth\", packet.connection);\n\tif (branch != string.Empty && branch != text)\n\t{\n\t\tUnityEngine.DebugEx.Log(\"Kicking \" + packet.connection?.ToString() + \" - their branch is '\" + text + \"' not '\" + branch + \"'\");\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Wrong Steam Beta: Requires '\" + branch + \"' branch!\");\n\t}\n\telse if (packet.connection.protocol > 2625)\n\t{\n\t\tUnityEngine.DebugEx.Log(\"Kicking \" + packet.connection?.ToString() + \" - their protocol is \" + packet.connection.protocol + \" not \" + 2625);\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Wrong Connection Protocol: Server update required!\");\n\t}\n\telse if (packet.connection.protocol < 2625)\n\t{\n\t\tUnityEngine.DebugEx.Log(\"Kicking \" + packet.connection?.ToString() + \" - their protocol is \" + packet.connection.protocol + \" not \" + 2625);\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Wrong Connection Protocol: Client update required!\");\n\t}\n\telse\n\t{\n\t\tpacket.connection.token = packet.read.BytesWithSize(512u);\n\t\tif (packet.connection.token == null || packet.connection.token.Length < 1)\n\t\t{\n\t\t\tNetwork.Net.sv.Kick(packet.connection, \"Invalid Token\");\n\t\t\treturn;\n\t\t}\n\t\tpacket.connection.anticheatId = packet.read.StringRaw(128);\n\t\tpacket.connection.anticheatToken = packet.read.StringRaw(2048);\n\t\tpacket.connection.clientChangeset = packet.read.Int32();\n\t\tpacket.connection.clientBuildTime = packet.read.Int64();\n\t\tpacket.connection.language = packet.read.String();\n\t\tauth.OnNewConnection(packet.connection);\n\t}\n}\n",
      "ParametersText": "Network.Connection connection",
      "TargetName": "ServerMgr",
      "MethodName": "OnGiveUserInformation",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2283023029,
      "Name": "OnPlayerSetInfo",
      "FullName": "OnPlayerSetInfo [server]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "name",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "value",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player set info occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void ClientReady(Network.Message packet)\n{\n\tif (packet.connection.state != Network.Connection.State.Welcoming)\n\t{\n\t\tNetwork.Net.sv.Kick(packet.connection, \"Invalid connection state\");\n\t\treturn;\n\t}\n\tusing (ProtoBuf.ClientReady clientReady = packet.read.Proto<ProtoBuf.ClientReady>())\n\t{\n\t\tforeach (ProtoBuf.ClientReady.ClientInfo item in clientReady.clientInfo)\n\t\t{\n\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerSetInfo\", packet.connection, item.name, item.value);\n\t\t\tpacket.connection.info.Set(item.name, item.value);\n\t\t}\n\t\tpacket.connection.globalNetworking = clientReady.globalNetworking;\n\t\tpacket.connection.state = Network.Connection.State.Connected;\n\t\tconnectionQueue.JoinedGame(packet.connection);\n\t\tFacepunch.Rust.Analytics.Azure.OnPlayerConnected(packet.connection);\n\t\tAddPartyMembersToTeam(packet.connection, clientReady.party);\n\t\tusing (TimeWarning.New(\"ClientReady\"))\n\t\t{\n\t\t\tBasePlayer basePlayer;\n\t\t\tusing (TimeWarning.New(\"SpawnPlayerSleeping\"))\n\t\t\t{\n\t\t\t\tbasePlayer = SpawnPlayerSleeping(packet.connection);\n\t\t\t}\n\t\t\tif (basePlayer == null)\n\t\t\t{\n\t\t\t\tusing (TimeWarning.New(\"SpawnNewPlayer\"))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer = SpawnNewPlayer(packet.connection);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbasePlayer.SendRespawnOptions();\n\t\t\tbasePlayer.LoadClanInfo();\n\t\t\tif (basePlayer != null)\n\t\t\t{\n\t\t\t\tCompanionServer.Util.SendSignedInNotification(basePlayer);\n\t\t\t}\n\t\t}\n\t}\n\tSendReplicatedVars(packet.connection);\n}\n",
      "ParametersText": "Network.Connection connection, string name, string value",
      "TargetName": "ServerMgr",
      "MethodName": "ClientReady",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 619699665,
      "Name": "OnFindSpawnPoint",
      "FullName": "OnFindSpawnPoint",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when find spawn point occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static BasePlayer.SpawnPoint FindSpawnPoint(BasePlayer forPlayer = null, ulong teamId = 0uL)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnFindSpawnPoint\", forPlayer, teamId);\n\tif (obj is BasePlayer.SpawnPoint)\n\t{\n\t\treturn (BasePlayer.SpawnPoint)obj;\n\t}\n\tbool flag = false;\n\tif (forPlayer != null && forPlayer.IsInTutorial)\n\t{\n\t\tTutorialIsland currentTutorialIsland = forPlayer.GetCurrentTutorialIsland();\n\t\tif (currentTutorialIsland != null)\n\t\t{\n\t\t\tBasePlayer.SpawnPoint spawnPoint = new BasePlayer.SpawnPoint();\n\t\t\tif (forPlayer.CurrentTutorialAllowance > BasePlayer.TutorialItemAllowance.Level1_HatchetPickaxe)\n\t\t\t{\n\t\t\t\tspawnPoint.pos = currentTutorialIsland.MidMissionSpawnPoint.position;\n\t\t\t\tspawnPoint.rot = currentTutorialIsland.MidMissionSpawnPoint.rotation;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tspawnPoint.pos = currentTutorialIsland.InitialSpawnPoint.position;\n\t\t\t\tspawnPoint.rot = currentTutorialIsland.InitialSpawnPoint.rotation;\n\t\t\t}\n\t\t\treturn spawnPoint;\n\t\t}\n\t}\n\tBaseGameMode baseGameMode = Gamemode();\n\tif ((bool)baseGameMode && baseGameMode.useCustomSpawns)\n\t{\n\t\tBasePlayer.SpawnPoint playerSpawn = baseGameMode.GetPlayerSpawn(forPlayer);\n\t\tif (playerSpawn != null)\n\t\t{\n\t\t\treturn playerSpawn;\n\t\t}\n\t}\n\tif (SingletonComponent<SpawnHandler>.Instance != null && !flag)\n\t{\n\t\tBasePlayer.SpawnPoint spawnPointForTeam = SpawnHandler.GetSpawnPointForTeam(teamId);\n\t\tif (spawnPointForTeam != null)\n\t\t{\n\t\t\tspawnPointForTeam.isProcedualSpawn = true;\n\t\t\treturn spawnPointForTeam;\n\t\t}\n\t\tBasePlayer.SpawnPoint spawnPoint2 = SpawnHandler.GetSpawnPoint();\n\t\tif (spawnPoint2 != null)\n\t\t{\n\t\t\tspawnPoint2.isProcedualSpawn = true;\n\t\t\treturn spawnPoint2;\n\t\t}\n\t}\n\tBasePlayer.SpawnPoint spawnPoint3 = new BasePlayer.SpawnPoint();\n\tif (forPlayer != null && forPlayer.IsInTutorial)\n\t{\n\t\tTutorialIsland currentTutorialIsland2 = forPlayer.GetCurrentTutorialIsland();\n\t\tif (currentTutorialIsland2 != null)\n\t\t{\n\t\t\tspawnPoint3.pos = currentTutorialIsland2.InitialSpawnPoint.position;\n\t\t\tspawnPoint3.rot = currentTutorialIsland2.InitialSpawnPoint.rotation;\n\t\t\treturn spawnPoint3;\n\t\t}\n\t}\n\tif (SingletonComponent<ServerMgr>.Instance.proceduralSpawnPoints == null)\n\t{\n\t\tSingletonComponent<ServerMgr>.Instance.proceduralSpawnPoints = UnityEngine.GameObject.FindGameObjectsWithTag(\"spawnpoint\");\n\t}\n\tif (SingletonComponent<ServerMgr>.Instance.fallbackProceduralSpawnPoints == null)\n\t{\n\t\tSingletonComponent<ServerMgr>.Instance.fallbackProceduralSpawnPoints = UnityEngine.GameObject.FindGameObjectsWithTag(\"SpawnPointFallback\");\n\t}\n\tif (SingletonComponent<ServerMgr>.Instance.proceduralSpawnPoints != null && SingletonComponent<ServerMgr>.Instance.proceduralSpawnPoints.Length != 0)\n\t{\n\t\tUnityEngine.GameObject gameObject = SingletonComponent<ServerMgr>.Instance.proceduralSpawnPoints[UnityEngine.Random.Range(0, SingletonComponent<ServerMgr>.Instance.proceduralSpawnPoints.Length)];\n\t\tspawnPoint3.pos = gameObject.transform.position;\n\t\tspawnPoint3.rot = gameObject.transform.rotation;\n\t}\n\telse if (SingletonComponent<ServerMgr>.Instance.fallbackProceduralSpawnPoints != null && SingletonComponent<ServerMgr>.Instance.fallbackProceduralSpawnPoints.Length != 0)\n\t{\n\t\tUnityEngine.GameObject gameObject2 = SingletonComponent<ServerMgr>.Instance.fallbackProceduralSpawnPoints[UnityEngine.Random.Range(0, SingletonComponent<ServerMgr>.Instance.fallbackProceduralSpawnPoints.Length)];\n\t\tspawnPoint3.pos = gameObject2.transform.position;\n\t\tspawnPoint3.rot = gameObject2.transform.rotation;\n\t}\n\telse\n\t{\n\t\tUnityEngine.Debug.Log(\"Couldn't find an appropriate spawnpoint for the player - so spawning at camera\");\n\t\tif (MainCamera.mainCamera != null)\n\t\t{\n\t\t\tspawnPoint3.pos = MainCamera.position;\n\t\t\tspawnPoint3.rot = MainCamera.rotation;\n\t\t}\n\t}\n\tif (UnityEngine.Physics.Raycast(new UnityEngine.Ray(spawnPoint3.pos, UnityEngine.Vector3.down), out var hitInfo, 32f, 1537286401))\n\t{\n\t\tspawnPoint3.pos = hitInfo.point;\n\t}\n\treturn spawnPoint3;\n}\n",
      "ParametersText": "",
      "TargetName": "ServerMgr",
      "MethodName": "FindSpawnPoint",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "BasePlayer.SpawnPoint"
    },
    {
      "Id": 834943051,
      "Name": "OnClientDisconnect",
      "FullName": "OnClientDisconnect",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a client disconnects."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ReadDisconnectReason(Network.Message packet)\n{\n\tstring text = packet.read.String(4096);\n\tstring text2 = packet.connection.ToString();\n\tif (!string.IsNullOrEmpty(text) && !string.IsNullOrEmpty(text2))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnClientDisconnect\", packet.connection, text);\n\t\tUnityEngine.DebugEx.Log(text2 + \" disconnecting: \" + text);\n\t}\n}\n",
      "ParametersText": "Network.Connection connection, string local0",
      "TargetName": "ServerMgr",
      "MethodName": "ReadDisconnectReason",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1619913319,
      "Name": "OnPlayerSpawn",
      "FullName": "OnPlayerSpawn",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public BasePlayer SpawnNewPlayer(Network.Connection connection)\n{\n\tRelationshipManager.PlayerTeam playerTeam = RelationshipManager.ServerInstance.FindPlayersTeam(connection.userid);\n\tBasePlayer.SpawnPoint spawnPoint = FindSpawnPoint(null, playerTeam?.teamID ?? 0);\n\tBasePlayer basePlayer = GameManager.server.CreateEntity(\"assets/prefabs/player/player.prefab\", spawnPoint.pos, spawnPoint.rot).ToPlayer();\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerSpawn\", basePlayer, connection) != null)\n\t{\n\t\treturn (BasePlayer)(object)spawnPoint;\n\t}\n\tbasePlayer.health = 0f;\n\tbasePlayer.lifestate = BaseCombatEntity.LifeState.Dead;\n\tbasePlayer.ResetLifeStateOnSpawn = false;\n\tbasePlayer.limitNetworking = true;\n\tif (connection == null)\n\t{\n\t\tbasePlayer.EnableTransferProtection();\n\t}\n\tbasePlayer.Spawn();\n\tbasePlayer.limitNetworking = false;\n\tif (connection != null)\n\t{\n\t\tbasePlayer.PlayerInit(connection);\n\t\tbool flag = !basePlayer.HasRespawnOptions() && !basePlayer.hasPreviousLife;\n\t\tif ((bool)BaseGameMode.GetActiveGameMode(serverside: true))\n\t\t{\n\t\t\tBaseGameMode.GetActiveGameMode(serverside: true).OnNewPlayer(basePlayer, flag);\n\t\t}\n\t\telse if (flag)\n\t\t{\n\t\t\tbasePlayer.Respawn();\n\t\t}\n\t\tUnityEngine.DebugEx.Log($\"{basePlayer.displayName} with steamid {basePlayer.userID.Get()} joined from ip {basePlayer.net.connection.ipaddress}\");\n\t\tUnityEngine.DebugEx.Log($\"\\tNetworkId {basePlayer.userID.Get()} is {basePlayer.net.ID} ({basePlayer.displayName})\");\n\t\tif (basePlayer.net.connection.ownerid != 0L && basePlayer.net.connection.ownerid != basePlayer.net.connection.userid)\n\t\t{\n\t\t\tUnityEngine.DebugEx.Log($\"\\t{basePlayer} is sharing the account {basePlayer.net.connection.ownerid}\");\n\t\t}\n\t}\n\tif (playerTeam != null && playerTeam.usePartySpawn && spawnPoint.isProcedualSpawn && playerTeam.firstSpawnLocation == default(UnityEngine.Vector3))\n\t{\n\t\tplayerTeam.firstSpawnLocation = spawnPoint.pos;\n\t}\n\treturn basePlayer;\n}\n",
      "ParametersText": "",
      "TargetName": "ServerMgr",
      "MethodName": "SpawnNewPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3615154331,
      "Name": "CanUseLockedEntity",
      "FullName": "CanUseLockedEntity [CodeLock, open]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use locked entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool OnTryToOpen(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseLockedEntity\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!IsLocked())\n\t{\n\t\treturn true;\n\t}\n\tif (whitelistPlayers.Contains(player.userID) || guestPlayers.Contains(player.userID))\n\t{\n\t\tDoEffect(effectUnlocked.resourcePath);\n\t\treturn true;\n\t}\n\tDoEffect(effectDenied.resourcePath);\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, CodeLock codeLock",
      "TargetName": "CodeLock",
      "MethodName": "OnTryToOpen",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3615154331,
      "Name": "CanUseLockedEntity",
      "FullName": "CanUseLockedEntity [CodeLock, close]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use locked entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool OnTryToClose(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseLockedEntity\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!IsLocked())\n\t{\n\t\treturn true;\n\t}\n\tif (whitelistPlayers.Contains(player.userID) || guestPlayers.Contains(player.userID))\n\t{\n\t\tDoEffect(effectUnlocked.resourcePath);\n\t\treturn true;\n\t}\n\tDoEffect(effectDenied.resourcePath);\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, CodeLock codeLock",
      "TargetName": "CodeLock",
      "MethodName": "OnTryToClose",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2118405101,
      "Name": "CanUnlock",
      "FullName": "CanUnlock [CodeLock]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to unlock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\nprivate void TryUnlock(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && IsLocked() && Oxide.Core.Interface.CallHook(\"CanUnlock\", rpc.player, this) == null && !IsCodeEntryBlocked() && whitelistPlayers.Contains(rpc.player.userID))\n\t{\n\t\tDoEffect(effectUnlocked.resourcePath);\n\t\tSetFlag(BaseEntity.Flags.Locked, b: false);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, CodeLock codeLock",
      "TargetName": "CodeLock",
      "MethodName": "TryUnlock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1531266972,
      "Name": "CanLock",
      "FullName": "CanLock [code]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to lock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\nprivate void TryLock(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && !IsLocked() && code.Length == 4 && Oxide.Core.Interface.CallHook(\"CanLock\", rpc.player, this) == null && whitelistPlayers.Contains(rpc.player.userID))\n\t{\n\t\tDoEffect(effectLocked.resourcePath);\n\t\tSetFlag(BaseEntity.Flags.Locked, b: true);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, CodeLock codeLock",
      "TargetName": "CodeLock",
      "MethodName": "TryLock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2119330727,
      "Name": "CanChangeCode",
      "FullName": "CanChangeCode",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to change code.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\nprivate void RPC_ChangeCode(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tstring text = rpc.read.String();\n\tbool flag = rpc.read.Bit();\n\tif (!IsLocked() && text.Length == 4 && UnityEngine.StringEx.IsNumeric(text) && !(!hasCode && flag) && Oxide.Core.Interface.CallHook(\"CanChangeCode\", rpc.player, this, text, flag) == null)\n\t{\n\t\tif (!hasCode && !flag)\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Locked, b: true);\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnCodelockChanged(rpc.player, this, flag ? guestCode : code, text, flag);\n\t\tif (!flag)\n\t\t{\n\t\t\tcode = text;\n\t\t\thasCode = code.Length > 0;\n\t\t\twhitelistPlayers.Clear();\n\t\t\twhitelistPlayers.Add(rpc.player.userID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tguestCode = text;\n\t\t\thasGuestCode = guestCode.Length > 0;\n\t\t\tguestPlayers.Clear();\n\t\t\tguestPlayers.Add(rpc.player.userID);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnCodeChanged\", rpc.player, this, text, flag);\n\t\tDoEffect(effectCodeChanged.resourcePath);\n\t\tSendNetworkUpdate();\n\t\tUpdateParentBox();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, CodeLock codeLock, string local0, bool local1",
      "TargetName": "CodeLock",
      "MethodName": "RPC_ChangeCode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3615154331,
      "Name": "CanUseLockedEntity",
      "FullName": "CanUseLockedEntity [KeyLock, close]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "keyLock",
          "typeName": "KeyLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use locked entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool OnTryToClose(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseLockedEntity\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (HasLockPermission(player))\n\t{\n\t\treturn true;\n\t}\n\treturn !IsLocked();\n}\n",
      "ParametersText": "BasePlayer player, KeyLock keyLock",
      "TargetName": "KeyLock",
      "MethodName": "OnTryToClose",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3615154331,
      "Name": "CanUseLockedEntity",
      "FullName": "CanUseLockedEntity [KeyLock, open]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "keyLock",
          "typeName": "KeyLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use locked entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool OnTryToOpen(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseLockedEntity\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (HasLockPermission(player))\n\t{\n\t\treturn true;\n\t}\n\treturn !IsLocked();\n}\n",
      "ParametersText": "BasePlayer player, KeyLock keyLock",
      "TargetName": "KeyLock",
      "MethodName": "OnTryToOpen",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2118405101,
      "Name": "CanUnlock",
      "FullName": "CanUnlock [KeyLock]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "keyLock",
          "typeName": "KeyLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to unlock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\nprivate void RPC_Unlock(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && IsLocked() && Oxide.Core.Interface.CallHook(\"CanUnlock\", rpc.player, this) == null && HasLockPermission(rpc.player))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Locked, b: false);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, KeyLock keyLock",
      "TargetName": "KeyLock",
      "MethodName": "RPC_Unlock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1531266972,
      "Name": "CanLock",
      "FullName": "CanLock [key]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "keyLock",
          "typeName": "KeyLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to lock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Lock(BasePlayer player)\n{\n\tif (!(player == null) && player.CanInteract() && !IsLocked() && Oxide.Core.Interface.CallHook(\"CanLock\", player, this) == null && HasLockPermission(player))\n\t{\n\t\tLockLock(player);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, KeyLock keyLock",
      "TargetName": "KeyLock",
      "MethodName": "Lock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 576899103,
      "Name": "OnLootEntity",
      "FullName": "OnLootEntity",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerLoot",
          "typeName": "PlayerLoot",
          "optional": false
        },
        {
          "name": "targetEntity",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when loot entity occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic bool StartLootingEntity(BaseEntity targetEntity, bool doPositionChecks = true)\n{\n\tClear();\n\tif (!targetEntity)\n\t{\n\t\treturn false;\n\t}\n\tif (!targetEntity.OnStartBeingLooted(base.baseEntity))\n\t{\n\t\treturn false;\n\t}\n\tUnityEngine.Assertions.Assert.IsTrue(targetEntity.isServer, \"Assure is server\");\n\tPositionChecks = doPositionChecks;\n\tentitySource = targetEntity;\n\titemSource = null;\n\tOxide.Core.Interface.CallHook(\"OnLootEntity\", GetComponent<BasePlayer>(), targetEntity);\n\tMarkDirty();\n\tif (targetEntity is ILootableEntity lootableEntity)\n\t{\n\t\tlootableEntity.LastLootedBy = base.baseEntity.userID;\n\t\tlootableEntity.LastLootedByPlayer = base.baseEntity;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "PlayerLoot playerLoot, BaseEntity targetEntity",
      "TargetName": "PlayerLoot",
      "MethodName": "StartLootingEntity",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2283722981,
      "Name": "OnLootItem",
      "FullName": "OnLootItem",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerLoot",
          "typeName": "PlayerLoot",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when loot item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartLootingItem(Item item)\n{\n\tClear();\n\tif (item != null && item.contents != null)\n\t{\n\t\tPositionChecks = true;\n\t\tcontainers.Add(item.contents);\n\t\titem.contents.onDirty += MarkDirty;\n\t\titemSource = item;\n\t\tentitySource = item.GetWorldEntity();\n\t\tOxide.Core.Interface.CallHook(\"OnLootItem\", GetComponent<BasePlayer>(), item);\n\t\tMarkDirty();\n\t}\n}\n",
      "ParametersText": "PlayerLoot playerLoot, Item item",
      "TargetName": "PlayerLoot",
      "MethodName": "StartLootingItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 78733418,
      "Name": "OnPlayerLootEnd",
      "FullName": "OnPlayerLootEnd",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerLoot",
          "typeName": "PlayerLoot",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Clear()\n{\n\tif (!IsLooting())\n\t{\n\t\treturn;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnPlayerLootEnd\", this);\n\tbase.baseEntity.HasClosedLoot();\n\tMarkDirty();\n\tif ((bool)entitySource)\n\t{\n\t\tentitySource.SendMessage(\"PlayerStoppedLooting\", base.baseEntity, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t}\n\tforeach (ItemContainer container in containers)\n\t{\n\t\tif (container != null)\n\t\t{\n\t\t\tcontainer.onDirty -= MarkDirty;\n\t\t}\n\t}\n\tClearContainers();\n\tentitySource = null;\n\titemSource = null;\n}\n",
      "ParametersText": "PlayerLoot playerLoot",
      "TargetName": "PlayerLoot",
      "MethodName": "Clear",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1899681783,
      "Name": "OnLootNetworkUpdate",
      "FullName": "OnLootNetworkUpdate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerLoot",
          "typeName": "PlayerLoot",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot network is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SendUpdate()\n{\n\tisInvokingSendUpdate = false;\n\tif (!base.baseEntity.IsValid() || Oxide.Core.Interface.CallHook(\"OnLootNetworkUpdate\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tusing ProtoBuf.PlayerUpdateLoot playerUpdateLoot = Facepunch.Pool.Get<ProtoBuf.PlayerUpdateLoot>();\n\tif ((bool)entitySource && entitySource.net != null)\n\t{\n\t\tplayerUpdateLoot.entityID = entitySource.net.ID;\n\t}\n\tif (itemSource != null)\n\t{\n\t\tplayerUpdateLoot.itemID = itemSource.uid;\n\t}\n\tif (containers.Count > 0)\n\t{\n\t\tplayerUpdateLoot.containers = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.ItemContainer>>();\n\t\tforeach (ItemContainer container in containers)\n\t\t{\n\t\t\tplayerUpdateLoot.containers.Add(container.Save());\n\t\t}\n\t}\n\tbase.baseEntity.ClientRPC(RpcTarget.Player(\"UpdateLoot\", base.baseEntity), playerUpdateLoot);\n}\n",
      "ParametersText": "PlayerLoot playerLoot",
      "TargetName": "PlayerLoot",
      "MethodName": "SendUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1437762689,
      "Name": "OnPlayerAttack",
      "FullName": "OnPlayerAttack [Melee]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "baseMelee",
          "typeName": "BaseMelee",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player attacks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void DoAttackShared(HitInfo info)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerAttack\", GetOwnerPlayer(), info) != null)\n\t{\n\t\treturn;\n\t}\n\tGetAttackStats(info);\n\tif (info.HitEntity != null)\n\t{\n\t\tusing (TimeWarning.New(\"OnAttacked\", 50))\n\t\t{\n\t\t\tinfo.HitEntity.OnAttacked(info);\n\t\t}\n\t}\n\tif (info.DoHitEffects && base.isServer)\n\t{\n\t\tusing (TimeWarning.New(\"ImpactEffect\", 20))\n\t\t{\n\t\t\tEffect.server.ImpactEffect(info);\n\t\t}\n\t\tif (!base.IsDestroyed)\n\t\t{\n\t\t\tSingletonComponent<Rust.Ai.Gen2.NpcNoiseManager>.Instance.OnMeleeHit(this, info);\n\t\t}\n\t}\n\tif (base.isServer && !base.IsDestroyed)\n\t{\n\t\tusing (TimeWarning.New(\"UpdateItemCondition\", 50))\n\t\t{\n\t\t\tUpdateItemCondition(info);\n\t\t}\n\t\tStartAttackCooldown(repeatDelay);\n\t}\n}\n",
      "ParametersText": "BaseMelee baseMelee, HitInfo info",
      "TargetName": "BaseMelee",
      "MethodName": "DoAttackShared",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 853308222,
      "Name": "OnMeleeAttack",
      "FullName": "OnMeleeAttack",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a melee attacks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\npublic void PlayerAttack(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!VerifyClientAttack(player))\n\t{\n\t\tSendNetworkUpdate();\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"PlayerAttack\", 50))\n\t{\n\t\tusing ProtoBuf.PlayerAttack playerAttack = msg.read.Proto<ProtoBuf.PlayerAttack>();\n\t\tif (playerAttack == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tHitInfo obj = Facepunch.Pool.Get<HitInfo>();\n\t\tobj.LoadFromAttack(playerAttack.attack, serverSide: true);\n\t\tobj.Initiator = player;\n\t\tobj.Weapon = this;\n\t\tobj.WeaponPrefab = this;\n\t\tobj.Predicted = msg.connection;\n\t\tobj.damageProperties = damageProperties;\n\t\tif (Oxide.Core.Interface.CallHook(\"OnMeleeAttack\", player, obj) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (obj.IsNaNOrInfinity())\n\t\t{\n\t\t\tstring shortPrefabName = base.ShortPrefabName;\n\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, \"Contains NaN (\" + shortPrefabName + \")\");\n\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_nan\");\n\t\t\treturn;\n\t\t}\n\t\tBaseEntity hitEntity = obj.HitEntity;\n\t\tBasePlayer basePlayer = obj.HitEntity as BasePlayer;\n\t\tbool flag = basePlayer != null;\n\t\tbool flag2 = flag && basePlayer.IsSleeping();\n\t\tbool flag3 = flag && basePlayer.IsWounded();\n\t\tbool flag4 = flag && basePlayer.isMounted;\n\t\tbool flag5 = flag && basePlayer.HasParent();\n\t\tbool flag6 = hitEntity != null;\n\t\tbool flag7 = flag6 && hitEntity.IsNpc;\n\t\tif (ConVar.AntiHack.melee_protection > 0)\n\t\t{\n\t\t\tbool flag8 = true;\n\t\t\tfloat num = 1f + ConVar.AntiHack.melee_forgiveness;\n\t\t\tfloat melee_clientframes = ConVar.AntiHack.melee_clientframes;\n\t\t\tfloat melee_serverframes = ConVar.AntiHack.melee_serverframes;\n\t\t\tfloat num2 = melee_clientframes / 60f;\n\t\t\tfloat num3 = melee_serverframes * Mathx.Max(UnityEngine.Time.deltaTime, UnityEngine.Time.smoothDeltaTime, UnityEngine.Time.fixedDeltaTime);\n\t\t\tfloat num4 = (player.desyncTimeClamped + num2 + num3) * num;\n\t\t\tint num5 = 1075904512;\n\t\t\tif (ConVar.AntiHack.melee_terraincheck)\n\t\t\t{\n\t\t\t\tnum5 |= 0x800000;\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.melee_vehiclecheck)\n\t\t\t{\n\t\t\t\tnum5 |= 0x8000000;\n\t\t\t}\n\t\t\tif (flag && obj.boneArea == (HitArea)(-1))\n\t\t\t{\n\t\t\t\tstring shortPrefabName2 = base.ShortPrefabName;\n\t\t\t\tstring shortPrefabName3 = basePlayer.ShortPrefabName;\n\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Bone is invalid  ({shortPrefabName2} on {shortPrefabName3} bone {obj.HitBone})\");\n\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_bone\");\n\t\t\t\tflag8 = false;\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.melee_protection >= 2)\n\t\t\t{\n\t\t\t\tif (flag6)\n\t\t\t\t{\n\t\t\t\t\tfloat num6 = hitEntity.AntiHackVelocity() + hitEntity.GetParentVelocity().magnitude;\n\t\t\t\t\tfloat num7 = hitEntity.AntiHackPadding() + num4 * num6;\n\t\t\t\t\tfloat num8 = hitEntity.Distance(obj.HitPositionWorld);\n\t\t\t\t\tif (num8 > num7)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName4 = base.ShortPrefabName;\n\t\t\t\t\t\tstring shortPrefabName5 = hitEntity.ShortPrefabName;\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Entity too far away ({shortPrefabName4} on {shortPrefabName5} with {num8}m > {num7}m in {num4}s)\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_target\");\n\t\t\t\t\t\tflag8 = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (ConVar.AntiHack.melee_protection >= 4 && flag8 && flag && !flag7 && !flag2 && !flag3 && !flag4 && !flag5)\n\t\t\t\t{\n\t\t\t\t\tfloat magnitude = basePlayer.GetParentVelocity().magnitude;\n\t\t\t\t\tfloat num9 = basePlayer.AntiHackPadding() + num4 * magnitude + ConVar.AntiHack.tickhistoryforgiveness;\n\t\t\t\t\tfloat num10 = basePlayer.tickHistory.Distance(basePlayer, obj.HitPositionWorld);\n\t\t\t\t\tif (num10 > num9)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName6 = base.ShortPrefabName;\n\t\t\t\t\t\tstring shortPrefabName7 = basePlayer.ShortPrefabName;\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Player too far away ({shortPrefabName6} on {shortPrefabName7} with {num10}m > {num9}m in {num4}s)\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"player_distance\");\n\t\t\t\t\t\tflag8 = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.melee_protection >= 1)\n\t\t\t{\n\t\t\t\tif (ConVar.AntiHack.melee_protection >= 4)\n\t\t\t\t{\n\t\t\t\t\tfloat magnitude2 = player.GetParentVelocity().magnitude;\n\t\t\t\t\tfloat num11 = player.AntiHackPadding() + num4 * magnitude2 + num * maxDistance;\n\t\t\t\t\tfloat num12 = player.tickHistory.Distance(player, obj.HitPositionWorld);\n\t\t\t\t\tif (num12 > num11)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName8 = base.ShortPrefabName;\n\t\t\t\t\t\tstring text = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Initiator too far away (tick history) ({shortPrefabName8} on {text} with {num12}m > {num11}m in {num4}s)\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_initiator_tick\");\n\t\t\t\t\t\tflag8 = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfloat num13 = player.AntiHackVelocity() + player.GetParentVelocity().magnitude;\n\t\t\t\t\tfloat num14 = player.AntiHackPadding() + num4 * num13 + num * maxDistance;\n\t\t\t\t\tfloat num15 = player.Distance(obj.HitPositionWorld);\n\t\t\t\t\tif (num15 > num14)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName9 = base.ShortPrefabName;\n\t\t\t\t\t\tstring text2 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Initiator too far away ({shortPrefabName9} on {text2} with {num15}m > {num14}m in {num4}s)\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_initiator\");\n\t\t\t\t\t\tflag8 = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.melee_protection >= 3)\n\t\t\t{\n\t\t\t\tif (flag6)\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Vector3 center = player.eyes.center;\n\t\t\t\t\tUnityEngine.Vector3 position = player.eyes.position;\n\t\t\t\t\tUnityEngine.Vector3 pointStart = obj.PointStart;\n\t\t\t\t\tUnityEngine.Vector3 hitPositionWorld = obj.HitPositionWorld;\n\t\t\t\t\thitPositionWorld -= (hitPositionWorld - pointStart).normalized * 0.001f;\n\t\t\t\t\tUnityEngine.Vector3 vector = obj.PositionOnRay(hitPositionWorld);\n\t\t\t\t\tbool num16 = MeleeLineOfSightEntity(center, position, pointStart, vector, hitPositionWorld, num5);\n\t\t\t\t\tif (!num16)\n\t\t\t\t\t{\n\t\t\t\t\t\tplayer.stats.Add(\"hit_\" + hitEntity.Categorize() + \"_indirect_los\", 1, Stats.Server);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tplayer.stats.Add(\"hit_\" + hitEntity.Categorize() + \"_direct_los\", 1, Stats.Server);\n\t\t\t\t\t}\n\t\t\t\t\tif (!num16)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName10 = base.ShortPrefabName;\n\t\t\t\t\t\tstring shortPrefabName11 = hitEntity.ShortPrefabName;\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Line of sight entity ({shortPrefabName10} on {shortPrefabName11}) {center} {position} {pointStart} {vector} {hitPositionWorld}\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_los_entity\");\n\t\t\t\t\t\tflag8 = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (flag8 && flag && !flag7)\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Vector3 hitPositionWorld2 = obj.HitPositionWorld;\n\t\t\t\t\tUnityEngine.Vector3 position2 = basePlayer.eyes.position;\n\t\t\t\t\tUnityEngine.Vector3 vector2 = basePlayer.CenterPoint();\n\t\t\t\t\tfloat melee_losforgiveness = ConVar.AntiHack.melee_losforgiveness;\n\t\t\t\t\tbool flag9 = GamePhysics.LineOfSight(hitPositionWorld2, position2, num5, 0f, melee_losforgiveness) && GamePhysics.LineOfSight(position2, hitPositionWorld2, num5, melee_losforgiveness, 0f);\n\t\t\t\t\tif (!flag9)\n\t\t\t\t\t{\n\t\t\t\t\t\tflag9 = GamePhysics.LineOfSight(hitPositionWorld2, vector2, num5, 0f, melee_losforgiveness) && GamePhysics.LineOfSight(vector2, hitPositionWorld2, num5, melee_losforgiveness, 0f);\n\t\t\t\t\t}\n\t\t\t\t\tif (!flag9)\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName12 = base.ShortPrefabName;\n\t\t\t\t\t\tstring shortPrefabName13 = basePlayer.ShortPrefabName;\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.MeleeHack, $\"Line of sight player ({shortPrefabName12} on {shortPrefabName13}) {hitPositionWorld2} {position2} or {hitPositionWorld2} {vector2}\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(obj, \"melee_los_player\");\n\t\t\t\t\t\tflag8 = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!flag8)\n\t\t\t{\n\t\t\t\tAntiHack.AddViolation(player, AntiHackType.MeleeHack, ConVar.AntiHack.melee_penalty);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tplayer.metabolism.UseHeart(heartStress * 0.2f);\n\t\tusing (TimeWarning.New(\"DoAttackShared\", 50))\n\t\t{\n\t\t\tDoAttackShared(obj);\n\t\t}\n\t\tFacepunch.Pool.Free(ref obj);\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, HitInfo local3",
      "TargetName": "BaseMelee",
      "MethodName": "PlayerAttack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1437762689,
      "Name": "OnPlayerAttack",
      "FullName": "OnPlayerAttack [Projectile]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player attacks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\npublic void OnProjectileAttack(BaseEntity.RPCMessage msg)\n{\n\tusing ProtoBuf.PlayerProjectileAttack playerProjectileAttack = msg.read.Proto<ProtoBuf.PlayerProjectileAttack>();\n\tif (playerProjectileAttack == null)\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.PlayerAttack playerAttack = playerProjectileAttack.playerAttack;\n\tusing HitInfo hitInfo = Facepunch.Pool.Get<HitInfo>();\n\thitInfo.LoadFromAttack(playerAttack.attack, serverSide: true);\n\thitInfo.Initiator = this;\n\thitInfo.ProjectileID = playerAttack.projectileID;\n\thitInfo.ProjectileDistance = playerProjectileAttack.hitDistance;\n\thitInfo.ProjectileVelocity = playerProjectileAttack.hitVelocity;\n\thitInfo.ProjectileTravelTime = playerProjectileAttack.travelTime;\n\thitInfo.Predicted = msg.connection;\n\tif (hitInfo.IsNaNOrInfinity() || float.IsNaN(playerProjectileAttack.travelTime) || float.IsInfinity(playerProjectileAttack.travelTime))\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Contains NaN ({playerAttack.projectileID})\");\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_nan\");\n\t\treturn;\n\t}\n\tif (!firedProjectiles.TryGetValue(playerAttack.projectileID, out var value))\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Missing ID ({playerAttack.projectileID})\", logToAnalytics: false);\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_invalid\");\n\t\treturn;\n\t}\n\thitInfo.ProjectileHits = value.hits;\n\thitInfo.ProjectileIntegrity = value.integrity;\n\thitInfo.ProjectileTrajectoryMismatch = value.trajectoryMismatch;\n\tif (value.integrity <= 0f)\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Integrity is zero ({playerAttack.projectileID})\");\n\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_integrity\");\n\t\treturn;\n\t}\n\tif (value.firedTime < UnityEngine.Time.realtimeSinceStartup - 8f)\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Lifetime is zero ({playerAttack.projectileID})\");\n\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_lifetime\");\n\t\treturn;\n\t}\n\tif (value.ricochets > 0)\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Projectile attack is ricochet ({playerAttack.projectileID})\");\n\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_ricochet_attack\");\n\t\treturn;\n\t}\n\tif (playerProjectileAttack.hitVelocity == UnityEngine.Vector3.zero)\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Projectile hitVelocity is zero ({playerAttack.projectileID})\");\n\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_zero_hit_velocity\");\n\t\treturn;\n\t}\n\thitInfo.Weapon = value.weaponSource;\n\thitInfo.WeaponPrefab = value.weaponPrefab;\n\thitInfo.ProjectilePrefab = value.projectilePrefab;\n\thitInfo.damageProperties = value.projectilePrefab.damageProperties;\n\tUnityEngine.Vector3 position = value.position;\n\tUnityEngine.Vector3 initialPositionOffset = value.initialPositionOffset;\n\tUnityEngine.Vector3 positionOffset = value.positionOffset;\n\tUnityEngine.Vector3 velocity = value.velocity;\n\tfloat partialTime = value.partialTime;\n\tfloat travelTime = value.travelTime;\n\tfloat num = UnityEngine.Mathf.Clamp(playerProjectileAttack.travelTime, value.travelTime, 8f);\n\tUnityEngine.Vector3 gravity = UnityEngine.Physics.gravity * value.projectilePrefab.gravityModifier;\n\tfloat drag = value.projectilePrefab.drag;\n\tBaseEntity hitEntity = hitInfo.HitEntity;\n\tBasePlayer basePlayer = hitEntity as BasePlayer;\n\tbool flag = basePlayer != null;\n\tbool flag2 = flag && basePlayer.IsSleeping();\n\tbool flag3 = flag && basePlayer.IsWounded();\n\tbool flag4 = flag && basePlayer.isMounted;\n\tbool flag5 = flag && basePlayer.HasParent();\n\tbool flag6 = hitEntity != null;\n\tbool flag7 = flag6 && hitEntity.IsNpc;\n\tbool flag8 = hitInfo.HitMaterial == Projectile.WaterMaterialID();\n\tif (value.protection <= 0)\n\t{\n\t\treturn;\n\t}\n\tbool flag9 = true;\n\tfloat num2 = 1f + ConVar.AntiHack.projectile_forgiveness;\n\tfloat num3 = 1f - ConVar.AntiHack.projectile_forgiveness;\n\tfloat projectile_clientframes = ConVar.AntiHack.projectile_clientframes;\n\tfloat projectile_serverframes = ConVar.AntiHack.projectile_serverframes;\n\tfloat num4 = Mathx.Decrement(value.firedTime);\n\tfloat num5 = UnityEngine.Mathf.Clamp(Mathx.Increment(UnityEngine.Time.realtimeSinceStartup) - num4, 0f, 8f);\n\tfloat num6 = num;\n\tfloat num7 = (value.desyncLifeTime = UnityEngine.Mathf.Abs(num5 - num6));\n\tfloat num8 = UnityEngine.Mathf.Min(num5, num6);\n\tfloat num9 = projectile_clientframes / 60f;\n\tfloat num10 = projectile_serverframes * Mathx.Max(UnityEngine.Time.deltaTime, UnityEngine.Time.smoothDeltaTime, UnityEngine.Time.fixedDeltaTime);\n\tfloat num11 = (desyncTimeClamped + num8 + num9 + num10) * num2;\n\tfloat num12 = ((value.protection >= 6) ? ((desyncTimeClamped + num9 + num10) * num2) : num11);\n\t_ = desyncTimeClamped;\n\tfloat num13 = UnityEngine.Vector3.Distance(value.initialPosition, hitInfo.HitPositionWorld);\n\tint num14 = 1075904512;\n\tif (ConVar.AntiHack.projectile_terraincheck)\n\t{\n\t\tnum14 |= 0x800000;\n\t}\n\tif (ConVar.AntiHack.projectile_vehiclecheck)\n\t{\n\t\tnum14 |= 0x8000000;\n\t}\n\tif (flag6 && net.group != null && hitEntity.net != null && hitEntity.net.group != null && !net.subscriber.IsSubscribed(hitEntity.net.group))\n\t{\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, \"Entity out of network range\");\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_network_range\");\n\t\tflag9 = false;\n\t}\n\tif (flag && hitInfo.boneArea == (HitArea)(-1))\n\t{\n\t\tstring arg = hitInfo.ProjectilePrefab.name;\n\t\tstring arg2 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Bone is invalid ({arg} on {arg2} bone {hitInfo.HitBone})\");\n\t\tstats.combat.LogInvalid(hitInfo, \"projectile_bone\");\n\t\tflag9 = false;\n\t}\n\tif (flag8)\n\t{\n\t\tif (flag6)\n\t\t{\n\t\t\tstring text = hitInfo.ProjectilePrefab.name;\n\t\t\tstring text2 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, \"Projectile water hit on entity (\" + text + \" on \" + text2 + \")\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"water_entity\");\n\t\t\tflag9 = false;\n\t\t}\n\t\tif (!WaterLevel.Test(hitInfo.HitPositionWorld - 0.5f * UnityEngine.Vector3.up, waves: true, volumes: true, this))\n\t\t{\n\t\t\tstring text3 = hitInfo.ProjectilePrefab.name;\n\t\t\tstring text4 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, \"Projectile water level (\" + text3 + \" on \" + text4 + \")\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"water_level\");\n\t\t\tflag9 = false;\n\t\t}\n\t}\n\tif (value.protection >= 2)\n\t{\n\t\tif (value.protection >= 6 && flag && !flag7 && !flag2 && !flag3 && !flag4 && !flag5)\n\t\t{\n\t\t\tfloat num15 = basePlayer.AntiHackPadding() + ConVar.AntiHack.tickhistoryforgiveness;\n\t\t\tfloat num16 = (value.entityDistance = basePlayer.tickHistory.Distance(basePlayer, hitInfo.HitPositionWorld));\n\t\t\tif (num16 > num15)\n\t\t\t{\n\t\t\t\tstring text5 = hitInfo.ProjectilePrefab.name;\n\t\t\t\tstring shortPrefabName = basePlayer.ShortPrefabName;\n\t\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Player too far away ({text5} on {shortPrefabName} with {num16}m > {num15}m in {num12}s)\");\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\t\tstats.combat.LogInvalid(hitInfo, \"player_distance\");\n\t\t\t\tflag9 = false;\n\t\t\t}\n\t\t}\n\t\telse if (flag6)\n\t\t{\n\t\t\tfloat num17 = hitEntity.AntiHackVelocity() + hitEntity.GetParentVelocity().magnitude;\n\t\t\tfloat num18 = hitEntity.AntiHackPadding() + num12 * num17;\n\t\t\tfloat num19 = (value.entityDistance = hitEntity.Distance(hitInfo.HitPositionWorld));\n\t\t\tif (num19 > num18)\n\t\t\t{\n\t\t\t\tstring text6 = hitInfo.ProjectilePrefab.name;\n\t\t\t\tstring shortPrefabName2 = hitEntity.ShortPrefabName;\n\t\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Entity too far away ({text6} on {shortPrefabName2} with {num19}m > {num18}m in {num12}s)\");\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\t\tstats.combat.LogInvalid(hitInfo, \"entity_distance\");\n\t\t\t\tflag9 = false;\n\t\t\t}\n\t\t}\n\t}\n\tif (value.protection >= 1)\n\t{\n\t\tfloat num20 = (flag6 ? (hitEntity.AntiHackVelocity() + hitEntity.GetParentVelocity().magnitude) : 0f);\n\t\tfloat num21 = (flag6 ? (num12 * num20) : 0f);\n\t\tfloat magnitude = value.initialVelocity.magnitude;\n\t\tfloat num22 = hitInfo.ProjectilePrefab.initialDistance + num11 * magnitude;\n\t\tfloat num23 = hitInfo.ProjectileDistance + 1f + positionOffset.magnitude + num21 + estimatedVelocity.magnitude;\n\t\tif (num13 > num22)\n\t\t{\n\t\t\tstring text7 = hitInfo.ProjectilePrefab.name;\n\t\t\tstring text8 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Projectile too fast ({text7} on {text8} with {num13}m > {num22}m in {num11}s)\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"projectile_maxspeed\");\n\t\t\tflag9 = false;\n\t\t}\n\t\tif (num13 > num23)\n\t\t{\n\t\t\tstring text9 = hitInfo.ProjectilePrefab.name;\n\t\t\tstring text10 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Projectile too far away ({text9} on {text10} with {num13}m > {num23}m in {num11}s)\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"projectile_distance\");\n\t\t\tflag9 = false;\n\t\t}\n\t\tif (num7 > ConVar.AntiHack.projectile_desync)\n\t\t{\n\t\t\tstring text11 = hitInfo.ProjectilePrefab.name;\n\t\t\tstring text12 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Projectile desync ({text11} on {text12} with {num7}s > {ConVar.AntiHack.projectile_desync}s)\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"projectile_desync\");\n\t\t\tflag9 = false;\n\t\t}\n\t}\n\tif (value.protection >= 4)\n\t{\n\t\tfloat num24 = 0f;\n\t\tif (flag6)\n\t\t{\n\t\t\tfloat num25 = hitEntity.GetParentVelocity().magnitude;\n\t\t\tif (hitEntity is ILargeVehicleForProjectiles)\n\t\t\t{\n\t\t\t\tnum25 += hitEntity.AntiHackVelocity();\n\t\t\t}\n\t\t\tnum24 = num12 * num25;\n\t\t}\n\t\tSimulateProjectile(ref position, ref velocity, ref partialTime, num - travelTime, gravity, drag, out var prevPosition, out var prevVelocity);\n\t\tLine line = new Line(prevPosition - prevVelocity, prevPosition);\n\t\tLine line2 = new Line(prevPosition, position);\n\t\tLine line3 = new Line(position, position + velocity);\n\t\tfloat num26 = Mathx.Min(line.Distance(hitInfo.PointStart), line2.Distance(hitInfo.PointStart), line3.Distance(hitInfo.PointStart));\n\t\tfloat num27 = Mathx.Min(line.Distance(hitInfo.HitPositionWorld), line2.Distance(hitInfo.HitPositionWorld), line3.Distance(hitInfo.HitPositionWorld));\n\t\tfloat num28 = (value.startPointMismatch = UnityEngine.Mathf.Max(num26 - initialPositionOffset.magnitude - num24, 0f));\n\t\tfloat num29 = (value.endPointMismatch = UnityEngine.Mathf.Max(num27 - initialPositionOffset.magnitude - num24, 0f));\n\t\tif (num28 > ConVar.AntiHack.projectile_trajectory)\n\t\t{\n\t\t\tstring text13 = value.projectilePrefab.name;\n\t\t\tstring text14 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Start position trajectory ({text13} on {text14} with {num28}m > {ConVar.AntiHack.projectile_trajectory}m)\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"trajectory_start\");\n\t\t\tflag9 = false;\n\t\t}\n\t\tif (num29 > ConVar.AntiHack.projectile_trajectory)\n\t\t{\n\t\t\tstring text15 = value.projectilePrefab.name;\n\t\t\tstring text16 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"End position trajectory ({text15} on {text16} with {num29}m > {ConVar.AntiHack.projectile_trajectory}m)\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"trajectory_end\");\n\t\t\tflag9 = false;\n\t\t}\n\t\tif (hitInfo.ProjectileTrajectoryMismatch > ConVar.AntiHack.projectile_trajectory_update)\n\t\t{\n\t\t\tstring text17 = value.projectilePrefab.name;\n\t\t\tstring text18 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Update position trajectory ({text17} on {text18} with {hitInfo.ProjectileTrajectoryMismatch}m > {ConVar.AntiHack.projectile_trajectory_update}m)\");\n\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\tstats.combat.LogInvalid(hitInfo, \"trajectory_update_total\");\n\t\t\tflag9 = false;\n\t\t}\n\t\thitInfo.ProjectileVelocity = velocity;\n\t\tif (playerProjectileAttack.hitVelocity != UnityEngine.Vector3.zero && velocity != UnityEngine.Vector3.zero)\n\t\t{\n\t\t\tfloat num30 = UnityEngine.Vector3.Angle(playerProjectileAttack.hitVelocity, velocity);\n\t\t\tfloat num31 = playerProjectileAttack.hitVelocity.magnitude / velocity.magnitude;\n\t\t\tif (num30 > ConVar.AntiHack.projectile_anglechange)\n\t\t\t{\n\t\t\t\tstring text19 = value.projectilePrefab.name;\n\t\t\t\tstring text20 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Trajectory angle change ({text19} on {text20} with {num30}deg > {ConVar.AntiHack.projectile_anglechange}deg)\");\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\t\tstats.combat.LogInvalid(hitInfo, \"angle_change\");\n\t\t\t\tflag9 = false;\n\t\t\t}\n\t\t\tif (num31 > ConVar.AntiHack.projectile_velocitychange)\n\t\t\t{\n\t\t\t\tstring text21 = value.projectilePrefab.name;\n\t\t\t\tstring text22 = (flag6 ? hitEntity.ShortPrefabName : \"world\");\n\t\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Trajectory velocity change ({text21} on {text22} with {num31} > {ConVar.AntiHack.projectile_velocitychange})\");\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\t\tstats.combat.LogInvalid(hitInfo, \"velocity_change\");\n\t\t\t\tflag9 = false;\n\t\t\t}\n\t\t}\n\t}\n\tif (value.protection >= 3)\n\t{\n\t\tif (value.simulatedPositions.Count > ConVar.AntiHack.projectile_update_limit)\n\t\t{\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"projectile_update_limit exceeded on attack ({value.simulatedPositions.Count} > {ConVar.AntiHack.projectile_update_limit})\");\n\t\t\tstats.combat.LogInvalid(hitInfo, \"projectile_update_limit\");\n\t\t\tflag9 = false;\n\t\t}\n\t\tif (flag9)\n\t\t{\n\t\t\tUnityEngine.Vector3 position2 = value.position;\n\t\t\tUnityEngine.Vector3 pointStart = hitInfo.PointStart;\n\t\t\tUnityEngine.Vector3 hitPositionWorld = hitInfo.HitPositionWorld;\n\t\t\tif (!flag8)\n\t\t\t{\n\t\t\t\thitPositionWorld -= hitInfo.ProjectileVelocity.normalized * 0.001f;\n\t\t\t}\n\t\t\tUnityEngine.Vector3 vector = hitInfo.PositionOnRay(hitPositionWorld);\n\t\t\tbool flag10 = LineOfSightBasic(position2, pointStart, vector, hitPositionWorld, value, num14);\n\t\t\tbool flag11 = true;\n\t\t\tif (flag10)\n\t\t\t{\n\t\t\t\tflag11 = LineOfSightDetailed(position2, value, num14);\n\t\t\t}\n\t\t\tbool flag12 = flag10 && flag11;\n\t\t\tif (!flag12)\n\t\t\t{\n\t\t\t\tstats.Add(\"hit_\" + (flag6 ? hitEntity.Categorize() : \"world\") + \"_indirect_los\", 1, Stats.Server);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstats.Add(\"hit_\" + (flag6 ? hitEntity.Categorize() : \"world\") + \"_direct_los\", 1, Stats.Server);\n\t\t\t}\n\t\t\tif (!flag12 && flag6)\n\t\t\t{\n\t\t\t\tstring text23 = hitInfo.ProjectilePrefab.name;\n\t\t\t\tstring shortPrefabName3 = hitEntity.ShortPrefabName;\n\t\t\t\tstring text24 = ((!flag10) ? \"projectile_los\" : \"projectile_los_detailed\");\n\t\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Line of sight {text24} ({text23} on {shortPrefabName3}) {position2} {pointStart} {vector} {hitPositionWorld}\");\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\t\tstats.combat.LogInvalid(hitInfo, text24);\n\t\t\t}\n\t\t\tif (!flag12)\n\t\t\t{\n\t\t\t\tflag9 = false;\n\t\t\t}\n\t\t}\n\t\tif (flag9 && flag && !flag7)\n\t\t{\n\t\t\tUnityEngine.Vector3 hitPositionWorld2 = hitInfo.HitPositionWorld;\n\t\t\tUnityEngine.Vector3 position3 = basePlayer.eyes.position;\n\t\t\tUnityEngine.Vector3 vector2 = basePlayer.CenterPoint();\n\t\t\tfloat projectile_losforgiveness = ConVar.AntiHack.projectile_losforgiveness;\n\t\t\tbool flag13 = LineOfSightPlayer(hitPositionWorld2, position3, num14, projectile_losforgiveness);\n\t\t\tif (!flag13)\n\t\t\t{\n\t\t\t\tflag13 = LineOfSightPlayer(hitPositionWorld2, vector2, num14, projectile_losforgiveness);\n\t\t\t}\n\t\t\tif (!flag13)\n\t\t\t{\n\t\t\t\tstring text25 = hitInfo.ProjectilePrefab.name;\n\t\t\t\tstring shortPrefabName4 = hitEntity.ShortPrefabName;\n\t\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Line of sight player ({text25} on {shortPrefabName4}) {hitPositionWorld2} {position3} or {hitPositionWorld2} {vector2}\");\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnProjectileHackViolation(value);\n\t\t\t\tstats.combat.LogInvalid(hitInfo, \"projectile_los_player\");\n\t\t\t\tflag9 = false;\n\t\t\t}\n\t\t}\n\t\tif (!flag9)\n\t\t{\n\t\t\tAntiHack.AddViolation(this, AntiHackType.ProjectileHack, ConVar.AntiHack.projectile_penalty);\n\t\t\treturn;\n\t\t}\n\t}\n\tvalue.position = hitInfo.HitPositionWorld;\n\tvalue.velocity = velocity.normalized * playerProjectileAttack.hitVelocity.magnitude;\n\tvalue.travelTime = num;\n\tvalue.partialTime = partialTime;\n\tvalue.hits++;\n\tvalue.lastEntityHit = hitEntity;\n\tvalue.simulatedPositions.Clear();\n\tvalue.simulatedPositions.Add(position);\n\thitInfo.ProjectilePrefab.CalculateDamage(hitInfo, value.projectileModifier, value.integrity);\n\tif (flag8)\n\t{\n\t\tif (hitInfo.ProjectilePrefab.waterIntegrityLoss > 0f)\n\t\t{\n\t\t\tvalue.integrity = UnityEngine.Mathf.Clamp01(value.integrity - hitInfo.ProjectilePrefab.waterIntegrityLoss);\n\t\t}\n\t}\n\telse if (hitInfo.ProjectilePrefab.penetrationPower <= 0f || !flag6)\n\t{\n\t\tvalue.integrity = 0f;\n\t}\n\telse\n\t{\n\t\tfloat num32 = hitEntity.PenetrationResistance(hitInfo) / hitInfo.ProjectilePrefab.penetrationPower;\n\t\tvalue.integrity = UnityEngine.Mathf.Clamp01(value.integrity - num32);\n\t}\n\tif (flag6)\n\t{\n\t\tstats.Add(value.itemMod.category + \"_hit_\" + hitEntity.Categorize(), 1);\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerAttack\", this, hitInfo) != null)\n\t{\n\t\treturn;\n\t}\n\tif (value.integrity <= 0f)\n\t{\n\t\tif (hitInfo.ProjectilePrefab.remainInWorld)\n\t\t{\n\t\t\tCreateWorldProjectile(hitInfo, value.itemDef, value.itemMod, hitInfo.ProjectilePrefab, value.pickupItem);\n\t\t}\n\t\tif (value.hits <= ConVar.AntiHack.projectile_impactspawndepth)\n\t\t{\n\t\t\tvalue.itemMod.ServerProjectileHit(hitInfo);\n\t\t}\n\t}\n\telse if (value.hits == ConVar.AntiHack.projectile_impactspawndepth)\n\t{\n\t\tvalue.itemMod.ServerProjectileHit(hitInfo);\n\t}\n\tfiredProjectiles[playerAttack.projectileID] = value;\n\tif (flag6)\n\t{\n\t\tif (value.hits <= ConVar.AntiHack.projectile_damagedepth)\n\t\t{\n\t\t\thitEntity.OnAttacked(hitInfo);\n\t\t\tvalue.itemMod.ServerProjectileHitEntity(hitInfo);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tstats.combat.LogInvalid(hitInfo, \"ricochet\");\n\t\t}\n\t}\n\tProjectile.CustomEffectData clientEffectData = value.projectilePrefab.clientEffectData;\n\tbool playDefaultHitEffects = value.projectilePrefab.playDefaultHitEffects;\n\tGameObjectRef clientEffectPrefab = value.projectilePrefab.clientEffectPrefab;\n\tif (!clientEffectData.UseCustomEffect || playDefaultHitEffects)\n\t{\n\t\tEffect.server.ImpactEffect(hitInfo);\n\t}\n\tif (clientEffectData.UseCustomEffect)\n\t{\n\t\tstring text26 = null;\n\t\tif (clientEffectPrefab != null && clientEffectPrefab.isValid)\n\t\t{\n\t\t\ttext26 = clientEffectPrefab.resourcePath;\n\t\t}\n\t\tif (text26 != null)\n\t\t{\n\t\t\tEffect.server.ImpactEffect(hitInfo, text26);\n\t\t}\n\t}\n\thitInfo.DoHitEffects = hitInfo.ProjectilePrefab.doHitEffects;\n\tSingletonComponent<Rust.Ai.Gen2.NpcNoiseManager>.Instance.OnProjectileHit(this, hitInfo);\n}\n",
      "ParametersText": "BasePlayer basePlayer, HitInfo local2",
      "TargetName": "BasePlayer",
      "MethodName": "OnProjectileAttack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1550249805,
      "Name": "OnPlayerSleepEnd",
      "FullName": "OnPlayerSleepEnd",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player sleep ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void EndSleeping()\n{\n\tif (IsSleeping() && Oxide.Core.Interface.CallHook(\"OnPlayerSleepEnd\", this) == null)\n\t{\n\t\tif (IsRestrained)\n\t\t{\n\t\t\tinventory.SetLockedByRestraint(flag: true);\n\t\t}\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, b: false);\n\t\tsleepStartTime = -1f;\n\t\tsleepingPlayerList.Remove(this);\n\t\tsleepingPlayerLookup.Remove(userID);\n\t\tif ((ulong)userID < 10000000 && !bots.Contains(this))\n\t\t{\n\t\t\tbots.Add(this);\n\t\t\tbotColliderWorkQueue.Add(this);\n\t\t}\n\t\tCancelInvoke(ScheduledDeath);\n\t\tInvokeRepeating(InventoryUpdate, 1f, 0.1f * UnityEngine.Random.Range(0.99f, 1.01f));\n\t\tif (RelationshipManager.TeamsEnabled())\n\t\t{\n\t\t\tInvokeRandomized(TeamUpdate, 1f, 4f, 1f);\n\t\t}\n\t\tInvokeRandomized(UpdateClanLastSeen, 300f, 300f, 60f);\n\t\tEnablePlayerCollider();\n\t\tRefreshColliderSize(forced: true);\n\t\tAddPlayerRigidbody();\n\t\tSetServerFall(wantsOn: false);\n\t\tRunOfflineMetabolism(state: false);\n\t\tif (HasParent())\n\t\t{\n\t\t\tSetParent(null, worldPositionStays: true);\n\t\t\tRemoveFromTriggers();\n\t\t\tForceUpdateTriggers();\n\t\t}\n\t\tinventory.containerMain.OnChanged();\n\t\tinventory.containerBelt.OnChanged();\n\t\tinventory.containerWear.OnChanged();\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerSleepEnded\", this);\n\t\tEACServer.LogPlayerSpawn(this);\n\t\tif (TotalPingCount > 0)\n\t\t{\n\t\t\tSendPingsToClient();\n\t\t}\n\t\tif (TutorialIsland.ShouldPlayerBeAskedToStartTutorial(this))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"PromptToStartTutorial\", this));\n\t\t}\n\t\tif (AntiHack.TestNoClipping(this, base.transform.position, base.transform.position, NoClipRadius(ConVar.AntiHack.noclip_margin), ConVar.AntiHack.noclip_backtracking, out var _))\n\t\t{\n\t\t\tForceCastNoClip();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "EndSleeping",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 291725147,
      "Name": "OnPlayerTick",
      "FullName": "OnPlayerTick",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player tick occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnReceiveTick(PlayerTick msg, bool wasPlayerStalled)\n{\n\tif (msg.inputState != null)\n\t{\n\t\tserverInput.Flip(msg.inputState);\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerTick\", this, msg, wasPlayerStalled) != null)\n\t{\n\t\treturn;\n\t}\n\tif (serverInput.current.buttons != serverInput.previous.buttons)\n\t{\n\t\tResetInputIdleTime();\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerInput\", this, serverInput) != null || IsReceivingSnapshot)\n\t{\n\t\treturn;\n\t}\n\tif (IsSpectating())\n\t{\n\t\tusing (TimeWarning.New(\"Tick_Spectator\"))\n\t\t{\n\t\t\tTick_Spectator();\n\t\t\treturn;\n\t\t}\n\t}\n\tif (IsDead())\n\t{\n\t\treturn;\n\t}\n\tif (IsSleeping())\n\t{\n\t\tif (serverInput.WasJustPressed(BUTTON.FIRE_PRIMARY) || serverInput.WasJustPressed(BUTTON.FIRE_SECONDARY) || serverInput.WasJustPressed(BUTTON.JUMP) || serverInput.WasJustPressed(BUTTON.DUCK))\n\t\t{\n\t\t\tEndSleeping();\n\t\t\tSendNetworkUpdateImmediate();\n\t\t}\n\t\tUpdateActiveItem(default(ItemId));\n\t\treturn;\n\t}\n\tif (IsRestrained && restraintItemId.HasValue && restraintItemId.HasValue)\n\t{\n\t\tUpdateActiveItem(restraintItemId.Value);\n\t}\n\telse if (!Belt.CanHoldItem())\n\t{\n\t\tUpdateActiveItem(default(ItemId));\n\t}\n\telse\n\t{\n\t\tUpdateActiveItem(msg.activeItem);\n\t}\n\tUpdateModelStateFromTick(msg);\n\tif (float.IsNaN(modelState.ducking) || float.IsInfinity(modelState.ducking))\n\t{\n\t\tKick(\"Kicked: invalid modelstate\");\n\t\treturn;\n\t}\n\tmodelState.ducking = UnityEngine.Mathf.Clamp01(modelState.ducking);\n\tif (IsIncapacitated())\n\t{\n\t\treturn;\n\t}\n\tForwardReceiveTickToListeners(msg);\n\tif (isMounted)\n\t{\n\t\tGetMounted().PlayerServerInput(serverInput, this);\n\t}\n\tUpdatePositionFromTick(msg, wasPlayerStalled);\n\tUpdateRotationFromTick(msg);\n\tif (TryGetActiveMissionInstance(out var instance) && instance.status == BaseMission.MissionStatus.Active && instance.NeedsPlayerInput())\n\t{\n\t\tProcessMissionEvent(BaseMission.MissionEventType.PLAYER_TICK, net.ID, 0f);\n\t}\n\tif (!TutorialIsland.EnforceTrespassChecks || IsAdmin || IsNpc || net == null || net.group == null)\n\t{\n\t\treturn;\n\t}\n\tif (net.group.restricted)\n\t{\n\t\tbool flag = false;\n\t\tif (!IsInTutorial)\n\t\t{\n\t\t\tflag = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTutorialIsland currentTutorialIsland = GetCurrentTutorialIsland();\n\t\t\tif (currentTutorialIsland == null || currentTutorialIsland.net.group != net.group)\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t\tif (flag)\n\t\t{\n\t\t\ttutorialKickTime += UnityEngine.Time.deltaTime;\n\t\t\tif (tutorialKickTime > 3f)\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning($\"Killing player {displayName}/{userID.Get()} as they are on a tutorial island that doesn't belong them\");\n\t\t\t\tHurt(999f);\n\t\t\t\ttutorialKickTime = 0f;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttutorialKickTime = 0f;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!IsInTutorial || net.group.restricted)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbool flag2 = false;\n\t\tTutorialIsland currentTutorialIsland2 = GetCurrentTutorialIsland();\n\t\tif (currentTutorialIsland2 == null || currentTutorialIsland2.net.group != net.group)\n\t\t{\n\t\t\tflag2 = true;\n\t\t}\n\t\tif (flag2)\n\t\t{\n\t\t\ttutorialKickTime += UnityEngine.Time.deltaTime;\n\t\t\tif (tutorialKickTime > 3f)\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning($\"Killing player {displayName}/{userID.Get()} as they are no longer on a tutorial island and are marked as being in a tutorial\");\n\t\t\t\tHurt(999f);\n\t\t\t\ttutorialKickTime = 0f;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttutorialKickTime = 0f;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "OnReceiveTick",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2953315606,
      "Name": "CanLootPlayer",
      "FullName": "CanLootPlayer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot player.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool CanBeLooted(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanLootPlayer\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player == this)\n\t{\n\t\treturn false;\n\t}\n\tif ((IsWounded() || IsSleeping() || CurrentGestureIsSurrendering || IsRestrainedOrSurrendering) && !IsLoadingAfterTransfer())\n\t{\n\t\treturn !IsTransferring();\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "CanBeLooted",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 578388980,
      "Name": "CanBeWounded",
      "FullName": "CanBeWounded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is wounded.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool EligibleForWounding(HitInfo info)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeWounded\", this, info);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!ConVar.Server.woundingenabled)\n\t{\n\t\treturn false;\n\t}\n\tif (IsWounded())\n\t{\n\t\treturn false;\n\t}\n\tif (IsSleeping())\n\t{\n\t\treturn false;\n\t}\n\tif (isMounted)\n\t{\n\t\treturn false;\n\t}\n\tif (info == null)\n\t{\n\t\treturn false;\n\t}\n\tif (!IsWounded() && UnityEngine.Time.realtimeSinceStartup - lastWoundedStartTime < ConVar.Server.rewounddelay)\n\t{\n\t\treturn false;\n\t}\n\tBaseGameMode activeGameMode = BaseGameMode.GetActiveGameMode(serverside: true);\n\tif ((bool)activeGameMode && !activeGameMode.allowWounding)\n\t{\n\t\treturn false;\n\t}\n\tif (triggers != null)\n\t{\n\t\tfor (int i = 0; i < triggers.Count; i++)\n\t\t{\n\t\t\tif (triggers[i] is IHurtTrigger)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\tif (info.WeaponPrefab is BaseMelee)\n\t{\n\t\treturn true;\n\t}\n\tif (info.WeaponPrefab is BaseProjectile)\n\t{\n\t\treturn !info.isHeadshot;\n\t}\n\tswitch (info.damageTypes.GetMajorityDamageType())\n\t{\n\tcase Rust.DamageType.Suicide:\n\t\treturn false;\n\tcase Rust.DamageType.Fall:\n\t\treturn true;\n\tcase Rust.DamageType.Bite:\n\t\treturn true;\n\tcase Rust.DamageType.Bleeding:\n\t\treturn true;\n\tcase Rust.DamageType.Hunger:\n\t\treturn true;\n\tcase Rust.DamageType.Thirst:\n\t\treturn true;\n\tcase Rust.DamageType.Poison:\n\t\treturn true;\n\tdefault:\n\t{\n\t\tif (BaseNetworkableEx.Is<Rust.Ai.Gen2.BaseNPC2>(info.Initiator, out var castedUnityObject) && !castedUnityObject.IsAnimal)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "EligibleForWounding",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 458523914,
      "Name": "OnPlayerRespawned",
      "FullName": "OnPlayerRespawned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is respawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RespawnAt(UnityEngine.Vector3 position, UnityEngine.Quaternion rotation, BaseEntity spawnPointEntity = null)\n{\n\tBaseGameMode activeGameMode = BaseGameMode.GetActiveGameMode(serverside: true);\n\tif ((bool)activeGameMode && !activeGameMode.CanPlayerRespawn(this))\n\t{\n\t\treturn;\n\t}\n\tSetPlayerFlag(BasePlayer.PlayerFlags.Wounded, b: false);\n\tSetPlayerFlag(BasePlayer.PlayerFlags.Incapacitated, b: false);\n\tSetPlayerFlag(BasePlayer.PlayerFlags.Unused2, b: false);\n\tSetPlayerFlag(BasePlayer.PlayerFlags.Unused1, b: false);\n\tSetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, b: true);\n\tSetPlayerFlag(BasePlayer.PlayerFlags.DisplaySash, b: false);\n\trespawnId = System.Guid.NewGuid().ToString(\"N\");\n\tServerPerformance.spawns++;\n\tUnityEngine.Vector3 position2 = base.transform.position;\n\tSetParent(null, worldPositionStays: true);\n\tbase.transform.SetPositionAndRotation(position, rotation);\n\tif (ActivePlayerInd != -1)\n\t{\n\t\tTickCache.Reset(this, position);\n\t}\n\ttickHistory.Reset(position);\n\teyeHistory.Clear();\n\tForceUpdateTriggers();\n\testimatedVelocity = UnityEngine.Vector3.zero;\n\testimatedSpeed = 0f;\n\testimatedSpeed2D = 0f;\n\tlastTickTime = 0f;\n\tlastStallTime = 0f;\n\tStopWounded();\n\tResetWoundingVars();\n\tStopSpectating();\n\tUpdateNetworkGroup();\n\tEnablePlayerCollider();\n\tRemovePlayerRigidbody();\n\tStartSleeping();\n\tLifeStoryStart();\n\tmetabolism.Reset();\n\tif (modifiers != null)\n\t{\n\t\tif (ConVar.Player.keepteaondeath)\n\t\t{\n\t\t\tmodifiers.RemoveAllExceptFromSource(Modifier.ModifierSource.Tea);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmodifiers.RemoveAll();\n\t\t}\n\t}\n\tInitializeHealth(StartHealth(), StartMaxHealth());\n\tbool flag = false;\n\tif (ConVar.Server.respawnWithLoadout)\n\t{\n\t\tstring infoString = GetInfoString(\"client.respawnloadout\", string.Empty);\n\t\tif (!string.IsNullOrEmpty(infoString) && ConVar.Inventory.LoadLoadout(infoString, out var so))\n\t\t{\n\t\t\tso.LoadItemsOnTo(this);\n\t\t\tflag = true;\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\tinventory.GiveDefaultItems();\n\t}\n\tSendNetworkUpdateImmediate();\n\tClientRPC(RpcTarget.Player(\"StartLoading\", this));\n\tif (ConVar.DeepSea.enabled && PointEntity<DeepSeaManager>.ServerInstance != null)\n\t{\n\t\tbool num = DeepSeaManager.IsInsideDeepSea(position2);\n\t\tbool flag2 = DeepSeaManager.IsInsideDeepSea(position);\n\t\tif (num != flag2)\n\t\t{\n\t\t\tPointEntity<DeepSeaManager>.ServerInstance.ClientRPC(RpcTarget.Player(\"CLIENT_PlayerEnterOrLeaveDeepSea\", this), flag2);\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnPlayerRespawned(this, spawnPointEntity);\n\tif ((bool)activeGameMode)\n\t{\n\t\tBaseGameMode.GetActiveGameMode(serverside: true).OnPlayerRespawn(this);\n\t}\n\tif (IsConnected)\n\t{\n\t\tEACServer.OnStartLoading(net.connection);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnPlayerRespawned\", this);\n\tProcessMissionEvent(BaseMission.MissionEventType.RESPAWN, 0, 0f);\n\tPlayerInjureState = GetInjureState();\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "RespawnAt",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1578450530,
      "Name": "OnPlayerSpectate",
      "FullName": "OnPlayerSpectate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player spectate occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartSpectating()\n{\n\tif (!IsSpectating() && Oxide.Core.Interface.CallHook(\"OnPlayerSpectate\", this, spectateFilter) == null)\n\t{\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Spectating, b: true);\n\t\tUnityEngine.TransformEx.SetLayerRecursive(base.gameObject, 10);\n\t\tCancelInvoke(InventoryUpdate);\n\t\tChatMessage(\"Becoming Spectator\");\n\t\tUpdateSpectateTarget(spectateFilter, invalidateIfNone: true);\n\t\tBaseEntity.Query.Server.RemovePlayer(this);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "StartSpectating",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1309639414,
      "Name": "OnPlayerSpectateEnd",
      "FullName": "OnPlayerSpectateEnd",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player spectate ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StopSpectating()\n{\n\tif (!IsSpectating() || Oxide.Core.Interface.CallHook(\"OnPlayerSpectateEnd\", this, spectateFilter) != null)\n\t{\n\t\treturn;\n\t}\n\tif ((bool)spectatingTarget)\n\t{\n\t\tBasePlayer.SpectatedSubStrategy obj = spectatingTarget.net.SubStrategy as BasePlayer.SpectatedSubStrategy;\n\t\tif (obj.RemoveSpectator(this))\n\t\t{\n\t\t\tFacepunch.Pool.Free(ref obj);\n\t\t\tspectatingTarget.net.SubStrategy = Network.Server.DefaultSubscriberStrategy;\n\t\t}\n\t}\n\tspectatingTarget = null;\n\tBasePlayer.SpectatorSubStrategy obj2 = net.SubStrategy as BasePlayer.SpectatorSubStrategy;\n\tFacepunch.Pool.Free(ref obj2);\n\tnet.SubStrategy = Network.Server.DefaultSubscriberStrategy;\n\tSetPlayerFlag(BasePlayer.PlayerFlags.Spectating, b: false);\n\tUnityEngine.TransformEx.SetLayerRecursive(base.gameObject, 17);\n\tBaseEntity.Query.Server.RemovePlayer(this);\n\tBaseEntity.Query.Server.AddPlayer(this);\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "StopSpectating",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2576432314,
      "Name": "OnPlayerHealthChange",
      "FullName": "OnPlayerHealthChange",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "oldvalue",
          "typeName": "System.Single",
          "optional": false
        },
        {
          "name": "newvalue",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player health is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnHealthChanged(float oldvalue, float newvalue)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerHealthChange\", this, oldvalue, newvalue) != null)\n\t{\n\t\treturn;\n\t}\n\tbase.OnHealthChanged(oldvalue, newvalue);\n\tif (base.isServer)\n\t{\n\t\tif (oldvalue > newvalue)\n\t\t{\n\t\t\tLifeStoryHurt(oldvalue - newvalue);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLifeStoryHeal(newvalue - oldvalue);\n\t\t}\n\t\tmetabolism.isDirty = true;\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, float oldvalue, float newvalue",
      "TargetName": "BasePlayer",
      "MethodName": "OnHealthChanged",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4058415132,
      "Name": "OnPlayerSleep",
      "FullName": "OnPlayerSleep",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void StartSleeping()\n{\n\tif (IsSleeping())\n\t{\n\t\treturn;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnPlayerSleep\", this);\n\tif (IsRestrained)\n\t{\n\t\tinventory.SetLockedByRestraint(flag: false);\n\t}\n\tbool flag = InSafeZone();\n\tfloat num = 1f;\n\tif (!flag && Rust.Application.isLoadingSave)\n\t{\n\t\tforeach (TriggerSafeZone allSafeZone in TriggerSafeZone.allSafeZones)\n\t\t{\n\t\t\tif (allSafeZone.triggerCollider.bounds.Intersects(WorldSpaceBounds().ToBounds()))\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t\tnum = 4f;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (flag && !IsInvoking(ScheduledDeath))\n\t{\n\t\tInvoke(ScheduledDeath, NPCAutoTurret.sleeperhostiledelay * num);\n\t}\n\tBaseMountable baseMountable = GetMounted();\n\tif (baseMountable != null && !AllowSleeperMounting(baseMountable))\n\t{\n\t\tEnsureDismounted();\n\t}\n\tSetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, b: true);\n\tsleepStartTime = UnityEngine.Time.time;\n\tsleepingPlayerList.TryAdd(this);\n\tsleepingPlayerLookup[userID] = this;\n\tbots.Remove(this);\n\tbotColliderWorkQueue.Remove(this);\n\tCancelInvoke(InventoryUpdate);\n\tCancelInvoke(TeamUpdate);\n\tCancelInvoke(UpdateClanLastSeen);\n\tinventory.loot.Clear();\n\tinventory.containerMain.OnChanged();\n\tinventory.containerBelt.OnChanged();\n\tinventory.containerWear.OnChanged();\n\tEnablePlayerCollider();\n\tif (!IsLoadingAfterTransfer())\n\t{\n\t\tRemovePlayerRigidbody();\n\t\tTurnOffAllLights();\n\t}\n\tSetServerFall(wantsOn: true);\n\tRunOfflineMetabolism(state: true);\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "StartSleeping",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3560982762,
      "Name": "OnPlayerDeath",
      "FullName": "OnPlayerDeath",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is dead."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Die(HitInfo info = null)\n{\n\tusing (TimeWarning.New(\"Player.Die\"))\n\t{\n\t\tif (!IsDead())\n\t\t{\n\t\t\tHandcuffs restraintItem = Belt.GetRestraintItem();\n\t\t\tif (restraintItem != null)\n\t\t\t{\n\t\t\t\trestraintItem.HeldWhenOwnerDied(this);\n\t\t\t}\n\t\t\tif (InGesture)\n\t\t\t{\n\t\t\t\tServer_CancelGesture();\n\t\t\t}\n\t\t\tif (Belt != null && ShouldDropActiveItem())\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 vector = new UnityEngine.Vector3(UnityEngine.Random.Range(-2f, 2f), 0.2f, UnityEngine.Random.Range(-2f, 2f));\n\t\t\t\tBelt.DropActive(GetDropPosition(), GetInheritedDropVelocity() + vector.normalized * 3f);\n\t\t\t}\n\t\t\tif (!WoundInsteadOfDying(info) && Oxide.Core.Interface.CallHook(\"OnPlayerDeath\", this, info) == null)\n\t\t\t{\n\t\t\t\tSleepingBag.OnPlayerDeath(this);\n\t\t\t\tbase.Die(info);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, HitInfo info",
      "TargetName": "BasePlayer",
      "MethodName": "Die",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1546340674,
      "Name": "OnPlayerRespawn",
      "FullName": "OnPlayerRespawn",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer+SpawnPoint",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player respawns."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Respawn()\n{\n\tBasePlayer.SpawnPoint spawnPoint = ServerMgr.FindSpawnPoint(this, 0uL);\n\tif (ConVar.Server.respawnAtDeathPosition && ServerCurrentDeathNote != null)\n\t{\n\t\tspawnPoint.pos = ServerCurrentDeathNote.worldPosition;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnPlayerRespawn\", this, spawnPoint);\n\tif (obj is BasePlayer.SpawnPoint)\n\t{\n\t\tspawnPoint = (BasePlayer.SpawnPoint)obj;\n\t}\n\tRespawnAt(spawnPoint.pos, spawnPoint.rot);\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer.SpawnPoint local0",
      "TargetName": "BasePlayer",
      "MethodName": "Respawn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1321158727,
      "Name": "OnPlayerKicked",
      "FullName": "OnPlayerKicked",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is kicked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Kick(string reason, bool reserveSlot = true)\n{\n\tif (IsConnected)\n\t{\n\t\tnet.connection.canReserveSlot = reserveSlot;\n\t\tNetwork.Net.sv.Kick(net.connection, reason);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerKicked\", this, reason, reserveSlot);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "Kick",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3832425726,
      "Name": "CanDropActiveItem",
      "FullName": "CanDropActiveItem",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to drop active item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool ShouldDropActiveItem()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanDropActiveItem\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "ShouldDropActiveItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2866798551,
      "Name": "OnActiveItemChange",
      "FullName": "OnActiveItemChange",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "itemID",
          "typeName": "ItemId",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an active item is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic void UpdateActiveItem(ItemId itemID)\n{\n\tUnityEngine.Assertions.Assert.IsTrue(base.isServer, \"Realm should be server!\");\n\tif (svActiveItemID == itemID)\n\t{\n\t\treturn;\n\t}\n\tif (equippingBlocked)\n\t{\n\t\titemID = default(ItemId);\n\t}\n\tItem item = inventory.containerBelt.FindItemByUID(itemID);\n\tif (IsItemHoldRestricted(item))\n\t{\n\t\titemID = default(ItemId);\n\t}\n\tItem activeItem = GetActiveItem();\n\tif (Oxide.Core.Interface.CallHook(\"OnActiveItemChange\", this, activeItem, itemID) != null)\n\t{\n\t\treturn;\n\t}\n\tsvActiveItemID = default(ItemId);\n\tif (activeItem != null)\n\t{\n\t\tHeldEntity heldEntity = activeItem.GetHeldEntity() as HeldEntity;\n\t\tif (heldEntity != null)\n\t\t{\n\t\t\theldEntity.SetHeld(bHeld: false);\n\t\t}\n\t}\n\tsvActiveItemID = itemID;\n\tSendNetworkUpdate();\n\tItem activeItem2 = GetActiveItem();\n\tif (activeItem2 != null)\n\t{\n\t\tHeldEntity heldEntity2 = activeItem2.GetHeldEntity() as HeldEntity;\n\t\tif (heldEntity2 != null)\n\t\t{\n\t\t\theldEntity2.SetHeld(bHeld: true);\n\t\t}\n\t\tNotifyGesturesNewItemEquipped();\n\t}\n\tinventory.UpdatedVisibleHolsteredItems();\n\tOxide.Core.Interface.CallHook(\"OnActiveItemChanged\", this, activeItem, activeItem2);\n}\n",
      "ParametersText": "BasePlayer basePlayer, Item local1, ItemId itemID",
      "TargetName": "BasePlayer",
      "MethodName": "UpdateActiveItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3035662177,
      "Name": "OnPlayerVoice",
      "FullName": "OnPlayerVoice",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player voice occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnReceivedVoice(byte[] data)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerVoice\", this, data) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tnetWrite.PacketID(Network.Message.Type.VoiceData);\n\t\tnetWrite.EntityID(net.ID);\n\t\tnetWrite.BytesWithSize(data);\n\t\tfloat num = 0f;\n\t\tif (HasPlayerFlag(BasePlayer.PlayerFlags.VoiceRangeBoost))\n\t\t{\n\t\t\tnum = ConVar.Voice.voiceRangeBoostAmount;\n\t\t}\n\t\tSystem.Collections.Generic.List<Network.Connection> connectionsWithin = BaseNetworkable.GetConnectionsWithin(base.transform.position, 100f + num, addSecondaryConnections: true, useRcEntityPosition: true, includeInvisPlayers: true);\n\t\tif (Network.PacketProfiler.shouldCaptureDetailedProfiling)\n\t\t{\n\t\t\tBaseEntity baseEntity = BaseNetworkable.serverEntities.Find(net.ID) as BaseEntity;\n\t\t\tNetwork.PacketProfiler.LogDetailedOutbound(Network.Message.Type.VoiceData, net.ID, (baseEntity != null) ? baseEntity.PrefabName : null, (int)netWrite.Length, null, Facepunch.Math.Epoch.Current, server: true);\n\t\t}\n\t\tnetWrite.Send(new Network.SendInfo(connectionsWithin)\n\t\t{\n\t\t\tpriority = Network.Priority.Immediate\n\t\t});\n\t\tif (activeTelephone != null)\n\t\t{\n\t\t\tactiveTelephone.OnReceivedVoiceFromUser(data);\n\t\t}\n\t\tif (SingletonComponent<Rust.Ai.Gen2.NpcNoiseManager>.Instance != null)\n\t\t{\n\t\t\tSingletonComponent<Rust.Ai.Gen2.NpcNoiseManager>.Instance.OnVoiceChat(this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "OnReceivedVoice",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3411611961,
      "Name": "OnPlayerInput",
      "FullName": "OnPlayerInput",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player input occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnReceiveTick(PlayerTick msg, bool wasPlayerStalled)\n{\n\tif (msg.inputState != null)\n\t{\n\t\tserverInput.Flip(msg.inputState);\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerTick\", this, msg, wasPlayerStalled) != null)\n\t{\n\t\treturn;\n\t}\n\tif (serverInput.current.buttons != serverInput.previous.buttons)\n\t{\n\t\tResetInputIdleTime();\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerInput\", this, serverInput) != null || IsReceivingSnapshot)\n\t{\n\t\treturn;\n\t}\n\tif (IsSpectating())\n\t{\n\t\tusing (TimeWarning.New(\"Tick_Spectator\"))\n\t\t{\n\t\t\tTick_Spectator();\n\t\t\treturn;\n\t\t}\n\t}\n\tif (IsDead())\n\t{\n\t\treturn;\n\t}\n\tif (IsSleeping())\n\t{\n\t\tif (serverInput.WasJustPressed(BUTTON.FIRE_PRIMARY) || serverInput.WasJustPressed(BUTTON.FIRE_SECONDARY) || serverInput.WasJustPressed(BUTTON.JUMP) || serverInput.WasJustPressed(BUTTON.DUCK))\n\t\t{\n\t\t\tEndSleeping();\n\t\t\tSendNetworkUpdateImmediate();\n\t\t}\n\t\tUpdateActiveItem(default(ItemId));\n\t\treturn;\n\t}\n\tif (IsRestrained && restraintItemId.HasValue && restraintItemId.HasValue)\n\t{\n\t\tUpdateActiveItem(restraintItemId.Value);\n\t}\n\telse if (!Belt.CanHoldItem())\n\t{\n\t\tUpdateActiveItem(default(ItemId));\n\t}\n\telse\n\t{\n\t\tUpdateActiveItem(msg.activeItem);\n\t}\n\tUpdateModelStateFromTick(msg);\n\tif (float.IsNaN(modelState.ducking) || float.IsInfinity(modelState.ducking))\n\t{\n\t\tKick(\"Kicked: invalid modelstate\");\n\t\treturn;\n\t}\n\tmodelState.ducking = UnityEngine.Mathf.Clamp01(modelState.ducking);\n\tif (IsIncapacitated())\n\t{\n\t\treturn;\n\t}\n\tForwardReceiveTickToListeners(msg);\n\tif (isMounted)\n\t{\n\t\tGetMounted().PlayerServerInput(serverInput, this);\n\t}\n\tUpdatePositionFromTick(msg, wasPlayerStalled);\n\tUpdateRotationFromTick(msg);\n\tif (TryGetActiveMissionInstance(out var instance) && instance.status == BaseMission.MissionStatus.Active && instance.NeedsPlayerInput())\n\t{\n\t\tProcessMissionEvent(BaseMission.MissionEventType.PLAYER_TICK, net.ID, 0f);\n\t}\n\tif (!TutorialIsland.EnforceTrespassChecks || IsAdmin || IsNpc || net == null || net.group == null)\n\t{\n\t\treturn;\n\t}\n\tif (net.group.restricted)\n\t{\n\t\tbool flag = false;\n\t\tif (!IsInTutorial)\n\t\t{\n\t\t\tflag = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTutorialIsland currentTutorialIsland = GetCurrentTutorialIsland();\n\t\t\tif (currentTutorialIsland == null || currentTutorialIsland.net.group != net.group)\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t\tif (flag)\n\t\t{\n\t\t\ttutorialKickTime += UnityEngine.Time.deltaTime;\n\t\t\tif (tutorialKickTime > 3f)\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning($\"Killing player {displayName}/{userID.Get()} as they are on a tutorial island that doesn't belong them\");\n\t\t\t\tHurt(999f);\n\t\t\t\ttutorialKickTime = 0f;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttutorialKickTime = 0f;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!IsInTutorial || net.group.restricted)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbool flag2 = false;\n\t\tTutorialIsland currentTutorialIsland2 = GetCurrentTutorialIsland();\n\t\tif (currentTutorialIsland2 == null || currentTutorialIsland2.net.group != net.group)\n\t\t{\n\t\t\tflag2 = true;\n\t\t}\n\t\tif (flag2)\n\t\t{\n\t\t\ttutorialKickTime += UnityEngine.Time.deltaTime;\n\t\t\tif (tutorialKickTime > 3f)\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning($\"Killing player {displayName}/{userID.Get()} as they are no longer on a tutorial island and are marked as being in a tutorial\");\n\t\t\t\tHurt(999f);\n\t\t\t\ttutorialKickTime = 0f;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttutorialKickTime = 0f;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "OnReceiveTick",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3876421037,
      "Name": "OnLootPlayer",
      "FullName": "OnLootPlayer",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when loot player occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_LootPlayer(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif ((bool)player && player.CanInteract() && CanBeLooted(player) && player.inventory.loot.StartLootingEntity(this))\n\t{\n\t\tplayer.inventory.loot.AddContainer(inventory.containerMain);\n\t\tplayer.inventory.loot.AddContainer(inventory.containerWear);\n\t\tplayer.inventory.loot.AddContainer(inventory.containerBelt);\n\t\tOxide.Core.Interface.CallHook(\"OnLootPlayer\", this, player);\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tplayer.RadioactiveLootCheck(player.inventory.loot.containers);\n\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), \"player_corpse\");\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer local0",
      "TargetName": "BasePlayer",
      "MethodName": "RPC_LootPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2897732171,
      "Name": "OnPlayerLand",
      "FullName": "OnPlayerLand",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player land occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ApplyFallDamageFromVelocity(float velocity)\n{\n\tif (IsGod())\n\t{\n\t\treturn;\n\t}\n\tfloat num = UnityEngine.Mathf.InverseLerp(-15f, -100f, velocity);\n\tif (num != 0f && Oxide.Core.Interface.CallHook(\"OnPlayerLand\", this, num) == null)\n\t{\n\t\tfloat num2 = ((modifiers != null) ? UnityEngine.Mathf.Clamp01(1f - modifiers.GetValue(Modifier.ModifierType.Clotting)) : 1f);\n\t\tmetabolism.bleeding.Add(num * 0.5f * num2);\n\t\tfloat num3 = num * 500f;\n\t\tFacepunch.Rust.Analytics.Azure.OnFallDamage(this, velocity, num3);\n\t\tHurt(num3, Rust.DamageType.Fall);\n\t\tif (num3 > 20f && fallDamageEffect.isValid && !isInvisible)\n\t\t{\n\t\t\tEffect.server.Run(fallDamageEffect.resourcePath, base.transform.position, UnityEngine.Vector3.zero);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerLanded\", this, num);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, float local0",
      "TargetName": "BasePlayer",
      "MethodName": "ApplyFallDamageFromVelocity",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 41951618,
      "Name": "OnPlayerLanded",
      "FullName": "OnPlayerLanded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is landed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ApplyFallDamageFromVelocity(float velocity)\n{\n\tif (IsGod())\n\t{\n\t\treturn;\n\t}\n\tfloat num = UnityEngine.Mathf.InverseLerp(-15f, -100f, velocity);\n\tif (num != 0f && Oxide.Core.Interface.CallHook(\"OnPlayerLand\", this, num) == null)\n\t{\n\t\tfloat num2 = ((modifiers != null) ? UnityEngine.Mathf.Clamp01(1f - modifiers.GetValue(Modifier.ModifierType.Clotting)) : 1f);\n\t\tmetabolism.bleeding.Add(num * 0.5f * num2);\n\t\tfloat num3 = num * 500f;\n\t\tFacepunch.Rust.Analytics.Azure.OnFallDamage(this, velocity, num3);\n\t\tHurt(num3, Rust.DamageType.Fall);\n\t\tif (num3 > 20f && fallDamageEffect.isValid && !isInvisible)\n\t\t{\n\t\t\tEffect.server.Run(fallDamageEffect.resourcePath, base.transform.position, UnityEngine.Vector3.zero);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerLanded\", this, num);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, float local0",
      "TargetName": "BasePlayer",
      "MethodName": "ApplyFallDamageFromVelocity",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 583626537,
      "Name": "CanSpectateTarget",
      "FullName": "CanSpectateTarget",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "strName",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to spectate target.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateSpectateTarget(string strName, bool invalidateIfNone = false)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanSpectateTarget\", this, strName) != null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = this;\n\tbool checkName;\n\tusing (TimeWarning.New(\"BasePlayer.UpdateSpectateTarget\"))\n\t{\n\t\tspectateFilter = strName;\n\t\tcheckName = !string.IsNullOrWhiteSpace(strName);\n\t\tusing PooledList<BasePlayer> pooledList = Facepunch.Pool.Get<PooledList<BasePlayer>>();\n\t\tint i = 0;\n\t\tfor (int count = activePlayerList.Count; i < count; i++)\n\t\t{\n\t\t\tBasePlayer basePlayer2 = activePlayerList[i];\n\t\t\tif (IsPlayerEligible(basePlayer2))\n\t\t\t{\n\t\t\t\tpooledList.Add(basePlayer2);\n\t\t\t}\n\t\t}\n\t\tif (pooledList.Count > 0)\n\t\t{\n\t\t\tpooledList.Sort(DisplayNameComparison);\n\t\t}\n\t\tif (net.connection.info.GetBool(\"global.spectatebots\"))\n\t\t{\n\t\t\tusing PooledList<BasePlayer> pooledList2 = Facepunch.Pool.Get<PooledList<BasePlayer>>();\n\t\t\tint j = 0;\n\t\t\tfor (int count2 = bots.Count; j < count2; j++)\n\t\t\t{\n\t\t\t\tBasePlayer basePlayer3 = bots[j];\n\t\t\t\tif (IsPlayerEligible(basePlayer3))\n\t\t\t\t{\n\t\t\t\t\tpooledList2.Add(basePlayer3);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pooledList2.Count > 0)\n\t\t\t{\n\t\t\t\tpooledList2.Sort(DisplayNameComparison);\n\t\t\t\tpooledList.AddRange(pooledList2);\n\t\t\t}\n\t\t}\n\t\tint count3 = pooledList.Count;\n\t\tif (count3 == 0)\n\t\t{\n\t\t\tChatMessage(\"No valid spectate targets for filter \" + spectateFilter + \"!\");\n\t\t\tif (invalidateIfNone)\n\t\t\t{\n\t\t\t\tSpectatePlayer(null);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tBasePlayer target = pooledList[SpectateOffset % count3];\n\t\t\tSpectatePlayer(target);\n\t\t}\n\t}\n\tbool IsPlayerEligible(BasePlayer player)\n\t{\n\t\tif (player == this)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (player == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (player.IsNpc)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (player.IsNpc || player.IsSpectating() || player.IsDead() || player.IsSleeping())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (checkName)\n\t\t{\n\t\t\tif (!UnityEngine.StringEx.Contains(player.displayName, spectateFilter, System.Globalization.CompareOptions.IgnoreCase))\n\t\t\t{\n\t\t\t\treturn player.UserIDString.Contains(spectateFilter);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn true;\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, string strName",
      "TargetName": "BasePlayer",
      "MethodName": "UpdateSpectateTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2283023029,
      "Name": "OnPlayerSetInfo",
      "FullName": "OnPlayerSetInfo",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "key",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "val",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player set info occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void SetInfo(string key, string val)\n{\n\tif (IsConnected)\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerSetInfo\", net.connection, key, val);\n\t\tnet.connection.info.Set(key, val);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, string key, string val",
      "TargetName": "BasePlayer",
      "MethodName": "SetInfo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4195813619,
      "Name": "OnPlayerAssist",
      "FullName": "OnPlayerAssist",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player assist occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_Assist(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && !(msg.player == this) && IsWounded() && Oxide.Core.Interface.CallHook(\"OnPlayerAssist\", this, msg.player) == null)\n\t{\n\t\tStopWounded(msg.player);\n\t\tmsg.player.stats.Add(\"wounded_assisted\", 1, (Stats)5);\n\t\tstats.Add(\"wounded_healed\", 1);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer player",
      "TargetName": "BasePlayer",
      "MethodName": "RPC_Assist",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 316982530,
      "Name": "OnPlayerKeepAlive",
      "FullName": "OnPlayerKeepAlive",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a keepalive ping is received."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_KeepAlive(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && !(msg.player == this) && IsWounded() && Oxide.Core.Interface.CallHook(\"OnPlayerKeepAlive\", this, msg.player) == null)\n\t{\n\t\tProlongWounding(10f);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer player",
      "TargetName": "BasePlayer",
      "MethodName": "RPC_KeepAlive",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2268037981,
      "Name": "OnActiveItemChanged",
      "FullName": "OnActiveItemChanged",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an active item is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic void UpdateActiveItem(ItemId itemID)\n{\n\tUnityEngine.Assertions.Assert.IsTrue(base.isServer, \"Realm should be server!\");\n\tif (svActiveItemID == itemID)\n\t{\n\t\treturn;\n\t}\n\tif (equippingBlocked)\n\t{\n\t\titemID = default(ItemId);\n\t}\n\tItem item = inventory.containerBelt.FindItemByUID(itemID);\n\tif (IsItemHoldRestricted(item))\n\t{\n\t\titemID = default(ItemId);\n\t}\n\tItem activeItem = GetActiveItem();\n\tif (Oxide.Core.Interface.CallHook(\"OnActiveItemChange\", this, activeItem, itemID) != null)\n\t{\n\t\treturn;\n\t}\n\tsvActiveItemID = default(ItemId);\n\tif (activeItem != null)\n\t{\n\t\tHeldEntity heldEntity = activeItem.GetHeldEntity() as HeldEntity;\n\t\tif (heldEntity != null)\n\t\t{\n\t\t\theldEntity.SetHeld(bHeld: false);\n\t\t}\n\t}\n\tsvActiveItemID = itemID;\n\tSendNetworkUpdate();\n\tItem activeItem2 = GetActiveItem();\n\tif (activeItem2 != null)\n\t{\n\t\tHeldEntity heldEntity2 = activeItem2.GetHeldEntity() as HeldEntity;\n\t\tif (heldEntity2 != null)\n\t\t{\n\t\t\theldEntity2.SetHeld(bHeld: true);\n\t\t}\n\t\tNotifyGesturesNewItemEquipped();\n\t}\n\tinventory.UpdatedVisibleHolsteredItems();\n\tOxide.Core.Interface.CallHook(\"OnActiveItemChanged\", this, activeItem, activeItem2);\n}\n",
      "ParametersText": "BasePlayer basePlayer, Item local1, Item local2",
      "TargetName": "BasePlayer",
      "MethodName": "UpdateActiveItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 555961858,
      "Name": "OnMapMarkersClear",
      "FullName": "OnMapMarkersClear",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when map markers clear occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\npublic void Server_ClearMapMarkers(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnMapMarkersClear\", this, State.pointsOfInterest) != null)\n\t{\n\t\treturn;\n\t}\n\tServerCurrentDeathNote?.Dispose();\n\tServerCurrentDeathNote = null;\n\tif (State.pointsOfInterest != null)\n\t{\n\t\tforeach (ProtoBuf.MapNote item in State.pointsOfInterest)\n\t\t{\n\t\t\titem?.Dispose();\n\t\t}\n\t\tState.pointsOfInterest.Clear();\n\t}\n\tDirtyPlayerState();\n\tTeamUpdate();\n\tOxide.Core.Interface.CallHook(\"OnMapMarkersCleared\", this);\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "Server_ClearMapMarkers",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1358655847,
      "Name": "OnMapMarkersCleared",
      "FullName": "OnMapMarkersCleared",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a map markers is cleared."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\npublic void Server_ClearMapMarkers(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnMapMarkersClear\", this, State.pointsOfInterest) != null)\n\t{\n\t\treturn;\n\t}\n\tServerCurrentDeathNote?.Dispose();\n\tServerCurrentDeathNote = null;\n\tif (State.pointsOfInterest != null)\n\t{\n\t\tforeach (ProtoBuf.MapNote item in State.pointsOfInterest)\n\t\t{\n\t\t\titem?.Dispose();\n\t\t}\n\t\tState.pointsOfInterest.Clear();\n\t}\n\tDirtyPlayerState();\n\tTeamUpdate();\n\tOxide.Core.Interface.CallHook(\"OnMapMarkersCleared\", this);\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "Server_ClearMapMarkers",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1622751857,
      "Name": "CanNetworkTo",
      "FullName": "CanNetworkTo [BasePlayer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to network to.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool ShouldNetworkTo(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanNetworkTo\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tbool flag = ShouldNetworkToSkipOcclusion(player);\n\tif (flag && ServerOcclusion.OcclusionEnabled && SupportsServerOcclusion() && this != player)\n\t{\n\t\tflag = OcclusionGetCachedVisibility(player);\n\t}\n\treturn flag;\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "ShouldNetworkTo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 137635766,
      "Name": "OnMapMarkerRemove",
      "FullName": "OnMapMarkerRemove",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a map marker is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server.CallsPerSecond(10uL)]\npublic void Server_RemovePointOfInterest(BaseEntity.RPCMessage msg)\n{\n\tint num = msg.read.Int32();\n\tif (State.pointsOfInterest != null && State.pointsOfInterest.Count > num && num >= 0 && Oxide.Core.Interface.CallHook(\"OnMapMarkerRemove\", this, State.pointsOfInterest, num) == null)\n\t{\n\t\tState.pointsOfInterest[num].Dispose();\n\t\tState.pointsOfInterest.RemoveAt(num);\n\t\tDirtyPlayerState();\n\t\tSendMarkersToClient();\n\t\tTeamUpdate();\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1, int local0",
      "TargetName": "BasePlayer",
      "MethodName": "Server_RemovePointOfInterest",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1405948638,
      "Name": "OnMapMarkerAdded",
      "FullName": "OnMapMarkerAdded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.MapNote",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a map marker is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.MapNote) })]\n[BaseEntity.RPC_Server.CallsPerSecond(8uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\npublic void Server_AddMarker(BaseEntity.RPCMessage msg)\n{\n\tProtoBuf.MapNote mapNote = msg.read.Proto<ProtoBuf.MapNote>();\n\tif (Oxide.Core.Interface.CallHook(\"OnMapMarkerAdd\", this, mapNote) != null || !CanUseMapMarkers)\n\t{\n\t\treturn;\n\t}\n\tif (State.pointsOfInterest == null)\n\t{\n\t\tState.pointsOfInterest = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.MapNote>>();\n\t}\n\tif (State.pointsOfInterest.Count >= ConVar.Server.maximumMapMarkers)\n\t{\n\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Short, MarkerLimitPhrase, false, ConVar.Server.maximumMapMarkers.ToString());\n\t\treturn;\n\t}\n\tif (mapNote.label == \"auto-name\")\n\t{\n\t\tint num = FindUnusedNumberName();\n\t\tif (num != -1)\n\t\t{\n\t\t\tmapNote.label = num.ToString();\n\t\t}\n\t}\n\tValidateMapNote(mapNote);\n\tif (mapNote.colourIndex == -1)\n\t{\n\t\tmapNote.colourIndex = FindUnusedPointOfInterestColour();\n\t}\n\tState.pointsOfInterest.Add(mapNote);\n\tDirtyPlayerState();\n\tSendMarkersToClient();\n\tTeamUpdate();\n\tOxide.Core.Interface.CallHook(\"OnMapMarkerAdded\", this, mapNote);\n}\n",
      "ParametersText": "BasePlayer basePlayer, ProtoBuf.MapNote local0",
      "TargetName": "BasePlayer",
      "MethodName": "Server_AddMarker",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 21048961,
      "Name": "OnPlayerCorpseSpawned",
      "FullName": "OnPlayerCorpseSpawned",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "PlayerCorpse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player corpse is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual BaseCorpse CreateCorpse(BasePlayer.PlayerFlags flagsOnDeath, UnityEngine.Vector3 posOnDeath, UnityEngine.Quaternion rotOnDeath, System.Collections.Generic.List<TriggerBase> triggersOnDeath, bool forceServerSide = false)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerCorpseSpawn\", this) != null)\n\t{\n\t\treturn null;\n\t}\n\tusing (TimeWarning.New(\"Create corpse\"))\n\t{\n\t\tstring strCorpsePrefab = ((!(ConVar.Physics.serversideragdolls || forceServerSide)) ? \"assets/prefabs/player/player_corpse.prefab\" : \"assets/prefabs/player/player_corpse_new.prefab\");\n\t\tbool flag = false;\n\t\tif (ConVar.Global.cinematicGingerbreadCorpses)\n\t\t{\n\t\t\tforeach (Item item in inventory.containerWear.itemList)\n\t\t\t{\n\t\t\t\tif (item != null && item.info.TryGetComponent<ItemCorpseOverride>(out var component))\n\t\t\t\t{\n\t\t\t\t\tstrCorpsePrefab = ((GetFloatBasedOnUserID(userID, 4332uL) > 0.5f) ? component.FemaleCorpse.resourcePath : component.MaleCorpse.resourcePath);\n\t\t\t\t\tflag = component.BlockWearableCopy;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tPlayerCorpse playerCorpse = DropCorpse(strCorpsePrefab, posOnDeath, rotOnDeath, flagsOnDeath, modelState) as PlayerCorpse;\n\t\tif ((bool)playerCorpse)\n\t\t{\n\t\t\tplayerCorpse.SetFlag(BaseEntity.Flags.Reserved5, HasPlayerFlag(BasePlayer.PlayerFlags.DisplaySash));\n\t\t\tif (!flag)\n\t\t\t{\n\t\t\t\tplayerCorpse.TakeFrom(this, inventory.containerMain, inventory.containerWear, inventory.containerBelt);\n\t\t\t}\n\t\t\tplayerCorpse.playerName = displayName;\n\t\t\tplayerCorpse.streamerName = Facepunch.RandomUsernames.Get(userID);\n\t\t\tplayerCorpse.playerSteamID = userID;\n\t\t\tplayerCorpse.underwearSkin = GetUnderwearSkin();\n\t\t\tif (!CollectionEx.IsNullOrEmpty(triggersOnDeath))\n\t\t\t{\n\t\t\t\tforeach (TriggerBase item2 in triggersOnDeath)\n\t\t\t\t{\n\t\t\t\t\tif (item2 is TriggerParent triggerParent)\n\t\t\t\t\t{\n\t\t\t\t\t\ttriggerParent.ForceParentEarly(playerCorpse);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tplayerCorpse.Spawn();\n\t\t\tplayerCorpse.TakeChildren(this);\n\t\t\tResourceDispenser component2 = playerCorpse.GetComponent<ResourceDispenser>();\n\t\t\tint num = 2;\n\t\t\tif (lifeStory != null)\n\t\t\t{\n\t\t\t\tnum += UnityEngine.Mathf.Clamp(UnityEngine.Mathf.FloorToInt(lifeStory.secondsAlive / 180f), 0, 20);\n\t\t\t}\n\t\t\tcomponent2.containedItems.Add(new ItemAmount(ItemManager.FindItemDefinition(\"fat.animal\"), num));\n\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerCorpseSpawned\", this, playerCorpse);\n\t\t\treturn playerCorpse;\n\t\t}\n\t}\n\treturn null;\n\tstatic float GetFloatBasedOnUserID(ulong steamid, ulong seed)\n\t{\n\t\tUnityEngine.Random.State state = UnityEngine.Random.state;\n\t\tUnityEngine.Random.InitState((int)(seed + steamid));\n\t\tfloat result = UnityEngine.Random.Range(0f, 1f);\n\t\tUnityEngine.Random.state = state;\n\t\treturn result;\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, PlayerCorpse local3",
      "TargetName": "BasePlayer",
      "MethodName": "CreateCorpse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1246450253,
      "Name": "OnDemoRecordingStart",
      "FullName": "OnDemoRecordingStart",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a demo recording starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartServerDemoRecording()\n{\n\tif (net != null && net.connection != null && !net.connection.IsRecording)\n\t{\n\t\tstring text = $\"demos/{UserIDString}/{System.DateTime.Now:yyyy-MM-dd-hhmmss}.dem\";\n\t\tif (Oxide.Core.Interface.CallHook(\"OnDemoRecordingStart\", text, this) == null)\n\t\t{\n\t\t\tUnityEngine.Debug.Log(ToString() + \" recording started: \" + text);\n\t\t\tnet.connection.StartRecording(text, new ConVar.Demo.Header\n\t\t\t{\n\t\t\t\tversion = ConVar.Demo.Version,\n\t\t\t\tlevel = UnityEngine.Application.loadedLevelName,\n\t\t\t\tlevelSeed = World.Seed,\n\t\t\t\tlevelSize = World.Size,\n\t\t\t\tchecksum = World.Checksum,\n\t\t\t\tlocalclient = userID,\n\t\t\t\tposition = eyes.position,\n\t\t\t\trotation = eyes.HeadForward(),\n\t\t\t\tlevelUrl = World.Url,\n\t\t\t\trecordedTime = System.DateTime.Now.ToBinary()\n\t\t\t});\n\t\t\tSendCompleteSnapshot();\n\t\t\tInvokeRepeating(actionMonitorServerDemoRecording, 10f, 10f);\n\t\t\tOxide.Core.Interface.CallHook(\"OnDemoRecordingStarted\", text, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "string local0, BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "StartServerDemoRecording",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3735248219,
      "Name": "OnDemoRecordingStarted",
      "FullName": "OnDemoRecordingStarted",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a demo recording starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StartServerDemoRecording()\n{\n\tif (net != null && net.connection != null && !net.connection.IsRecording)\n\t{\n\t\tstring text = $\"demos/{UserIDString}/{System.DateTime.Now:yyyy-MM-dd-hhmmss}.dem\";\n\t\tif (Oxide.Core.Interface.CallHook(\"OnDemoRecordingStart\", text, this) == null)\n\t\t{\n\t\t\tUnityEngine.Debug.Log(ToString() + \" recording started: \" + text);\n\t\t\tnet.connection.StartRecording(text, new ConVar.Demo.Header\n\t\t\t{\n\t\t\t\tversion = ConVar.Demo.Version,\n\t\t\t\tlevel = UnityEngine.Application.loadedLevelName,\n\t\t\t\tlevelSeed = World.Seed,\n\t\t\t\tlevelSize = World.Size,\n\t\t\t\tchecksum = World.Checksum,\n\t\t\t\tlocalclient = userID,\n\t\t\t\tposition = eyes.position,\n\t\t\t\trotation = eyes.HeadForward(),\n\t\t\t\tlevelUrl = World.Url,\n\t\t\t\trecordedTime = System.DateTime.Now.ToBinary()\n\t\t\t});\n\t\t\tSendCompleteSnapshot();\n\t\t\tInvokeRepeating(actionMonitorServerDemoRecording, 10f, 10f);\n\t\t\tOxide.Core.Interface.CallHook(\"OnDemoRecordingStarted\", text, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "string local0, BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "StartServerDemoRecording",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3792359227,
      "Name": "OnDemoRecordingStop",
      "FullName": "OnDemoRecordingStop",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a demo recording stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StopServerDemoRecording()\n{\n\tif (net != null && net.connection != null && net.connection.IsRecording && Oxide.Core.Interface.CallHook(\"OnDemoRecordingStop\", net.connection.recordFilename, this) == null)\n\t{\n\t\tUnityEngine.Debug.Log(ToString() + \" recording stopped: \" + net.connection.RecordFilename);\n\t\tnet.connection.StopRecording();\n\t\tCancelInvoke(actionMonitorServerDemoRecording);\n\t\tOxide.Core.Interface.CallHook(\"OnDemoRecordingStopped\", net.connection.recordFilename, this);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "StopServerDemoRecording",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1350840123,
      "Name": "OnDemoRecordingStopped",
      "FullName": "OnDemoRecordingStopped",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a demo recording stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StopServerDemoRecording()\n{\n\tif (net != null && net.connection != null && net.connection.IsRecording && Oxide.Core.Interface.CallHook(\"OnDemoRecordingStop\", net.connection.recordFilename, this) == null)\n\t{\n\t\tUnityEngine.Debug.Log(ToString() + \" recording stopped: \" + net.connection.RecordFilename);\n\t\tnet.connection.StopRecording();\n\t\tCancelInvoke(actionMonitorServerDemoRecording);\n\t\tOxide.Core.Interface.CallHook(\"OnDemoRecordingStopped\", net.connection.recordFilename, this);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "StopServerDemoRecording",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3272677704,
      "Name": "OnThreatLevelUpdate",
      "FullName": "OnThreatLevelUpdate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a threat level is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EnsureUpdated()\n{\n\tif (UnityEngine.Time.realtimeSinceStartup - lastUpdateTime < 30f)\n\t{\n\t\treturn;\n\t}\n\tlastUpdateTime = UnityEngine.Time.realtimeSinceStartup;\n\tcachedThreatLevel = 0f;\n\tif (IsSleeping() || Oxide.Core.Interface.CallHook(\"OnThreatLevelUpdate\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (inventory.containerWear.itemList.Count > 2)\n\t{\n\t\tcachedThreatLevel += 1f;\n\t}\n\tforeach (Item item in inventory.containerBelt.itemList)\n\t{\n\t\tBaseEntity heldEntity = item.GetHeldEntity();\n\t\tif ((bool)heldEntity && heldEntity is BaseProjectile && !(heldEntity is BowWeapon))\n\t\t{\n\t\t\tcachedThreatLevel += 2f;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "EnsureUpdated",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3846141295,
      "Name": "OnRespawnInformationGiven",
      "FullName": "OnRespawnInformationGiven",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Collections.Generic.List`1[ProtoBuf.RespawnInformation+SpawnOptions]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when respawn information given occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendRespawnOptions()\n{\n\tif (NexusServer.Started && ZoneController.Instance.CanRespawnAcrossZones(this))\n\t{\n\t\tCollectExternalAndSend();\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions> list = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions>>();\n\tGetRespawnOptionsForPlayer(list, userID);\n\tOxide.Core.Interface.CallHook(\"OnRespawnInformationGiven\", this, list);\n\tSendToPlayer(list, loading: false);\n\tasync void CollectExternalAndSend()\n\t{\n\t\tSystem.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions> list2 = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions>>();\n\t\tGetRespawnOptionsForPlayer(list2, userID);\n\t\tSystem.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions> allSpawnOptions = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions>>();\n\t\tforeach (ProtoBuf.RespawnInformation.SpawnOptions item in list2)\n\t\t{\n\t\t\tallSpawnOptions.Add(item.Copy());\n\t\t}\n\t\tSendToPlayer(list2, loading: true);\n\t\ttry\n\t\t{\n\t\t\tProtoBuf.Nexus.Request request = Facepunch.Pool.Get<ProtoBuf.Nexus.Request>();\n\t\t\trequest.spawnOptions = Facepunch.Pool.Get<ProtoBuf.Nexus.SpawnOptionsRequest>();\n\t\t\trequest.spawnOptions.userId = userID;\n\t\t\tusing (NexusRpcResult nexusRpcResult = await NexusServer.BroadcastRpc(request, 10f))\n\t\t\t{\n\t\t\t\tforeach (System.Collections.Generic.KeyValuePair<string, ProtoBuf.Nexus.Response> response in nexusRpcResult.Responses)\n\t\t\t\t{\n\t\t\t\t\tstring key = response.Key;\n\t\t\t\t\tProtoBuf.Nexus.SpawnOptionsResponse spawnOptions2 = response.Value.spawnOptions;\n\t\t\t\t\tif (spawnOptions2 != null && spawnOptions2.spawnOptions.Count != 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (ProtoBuf.RespawnInformation.SpawnOptions spawnOption in spawnOptions2.spawnOptions)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tProtoBuf.RespawnInformation.SpawnOptions spawnOptions3 = spawnOption.Copy();\n\t\t\t\t\t\t\tspawnOptions3.nexusZone = key;\n\t\t\t\t\t\t\tallSpawnOptions.Add(spawnOptions3);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tSendToPlayer(allSpawnOptions, loading: false);\n\t\t}\n\t\tcatch (System.Exception exception)\n\t\t{\n\t\t\tUnityEngine.Debug.LogException(exception);\n\t\t}\n\t}\n\tvoid SendToPlayer(System.Collections.Generic.List<ProtoBuf.RespawnInformation.SpawnOptions> spawnOptions, bool loading)\n\t{\n\t\tusing ProtoBuf.RespawnInformation respawnInformation = Facepunch.Pool.Get<ProtoBuf.RespawnInformation>();\n\t\trespawnInformation.spawnOptions = spawnOptions;\n\t\trespawnInformation.loading = loading;\n\t\tif (LegacyShelter.max_shelters == LegacyShelter.FpShelterDefault && LegacyShelter.SheltersPerPlayer.ContainsKey(userID) && LegacyShelter.SheltersPerPlayer[userID].Count > 0)\n\t\t{\n\t\t\trespawnInformation.shelterPositions = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.Vector3>>();\n\t\t\tforeach (LegacyShelter item2 in LegacyShelter.SheltersPerPlayer[userID])\n\t\t\t{\n\t\t\t\trespawnInformation.shelterPositions.Add(item2.transform.position);\n\t\t\t}\n\t\t}\n\t\tif (IsDead())\n\t\t{\n\t\t\trespawnInformation.previousLife = previousLifeStory;\n\t\t\tif (!ConVar.Server.skipDeathScreenFade)\n\t\t\t{\n\t\t\t\trespawnInformation.fadeIn = previousLifeStory != null && previousLifeStory.timeDied > Facepunch.Math.Epoch.Current - 5;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trespawnInformation.fadeIn = false;\n\t\t\t}\n\t\t}\n\t\tClientRPC(RpcTarget.Player(\"OnRespawnInformation\", this), respawnInformation);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, System.Collections.Generic.List`1[ProtoBuf.RespawnInformation.SpawnOptions] local0",
      "TargetName": "BasePlayer",
      "MethodName": "SendRespawnOptions",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3045496198,
      "Name": "OnPlayerRecover",
      "FullName": "OnPlayerRecover",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player recover occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RecoverFromWounded()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerRecover\", this) == null)\n\t{\n\t\tif (IsCrawling())\n\t\t{\n\t\t\tbase.health = UnityEngine.Random.Range(2f, 6f) + healingWhileCrawling;\n\t\t}\n\t\thealingWhileCrawling = 0f;\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Wounded, b: false);\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Incapacitated, b: false);\n\t\tif ((bool)BaseGameMode.GetActiveGameMode(base.isServer))\n\t\t{\n\t\t\tBaseGameMode.GetActiveGameMode(base.isServer).OnPlayerRevived(null, this);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerRecovered\", this);\n\t\tRefreshColliderSize(forced: true);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "RecoverFromWounded",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1875605816,
      "Name": "OnPlayerWound",
      "FullName": "OnPlayerWound",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is wounded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void BecomeWounded(HitInfo info)\n{\n\tif (IsWounded() || Oxide.Core.Interface.CallHook(\"OnPlayerWound\", this, info) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = info != null && info.damageTypes.GetMajorityDamageType() == Rust.DamageType.Fall;\n\tif (IsCrawling())\n\t{\n\t\twoundedByFallDamage |= flag;\n\t\tGoToIncapacitated(info);\n\t\treturn;\n\t}\n\twoundedByFallDamage = flag;\n\tif (flag || !ConVar.Server.crawlingenabled)\n\t{\n\t\tGoToIncapacitated(info);\n\t}\n\telse\n\t{\n\t\tGoToCrawling(info);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, HitInfo info",
      "TargetName": "BasePlayer",
      "MethodName": "BecomeWounded",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1682271133,
      "Name": "OnPlayerRecovered",
      "FullName": "OnPlayerRecovered",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is recovered."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RecoverFromWounded()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerRecover\", this) == null)\n\t{\n\t\tif (IsCrawling())\n\t\t{\n\t\t\tbase.health = UnityEngine.Random.Range(2f, 6f) + healingWhileCrawling;\n\t\t}\n\t\thealingWhileCrawling = 0f;\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Wounded, b: false);\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Incapacitated, b: false);\n\t\tif ((bool)BaseGameMode.GetActiveGameMode(base.isServer))\n\t\t{\n\t\t\tBaseGameMode.GetActiveGameMode(base.isServer).OnPlayerRevived(null, this);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerRecovered\", this);\n\t\tRefreshColliderSize(forced: true);\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "RecoverFromWounded",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3894432051,
      "Name": "OnPlayerColliderEnable",
      "FullName": "OnPlayerColliderEnable",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player collider enable occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EnablePlayerCollider()\n{\n\tif (!playerCollider.enabled && Oxide.Core.Interface.CallHook(\"OnPlayerColliderEnable\", this, playerCollider) == null && !(base.isServer & isInvisible))\n\t{\n\t\tRefreshColliderSize(forced: true);\n\t\tplayerCollider.enabled = true;\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "EnablePlayerCollider",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3025469128,
      "Name": "OnPlayerSleepEnded",
      "FullName": "OnPlayerSleepEnded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player sleep ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void EndSleeping()\n{\n\tif (IsSleeping() && Oxide.Core.Interface.CallHook(\"OnPlayerSleepEnd\", this) == null)\n\t{\n\t\tif (IsRestrained)\n\t\t{\n\t\t\tinventory.SetLockedByRestraint(flag: true);\n\t\t}\n\t\tSetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, b: false);\n\t\tsleepStartTime = -1f;\n\t\tsleepingPlayerList.Remove(this);\n\t\tsleepingPlayerLookup.Remove(userID);\n\t\tif ((ulong)userID < 10000000 && !bots.Contains(this))\n\t\t{\n\t\t\tbots.Add(this);\n\t\t\tbotColliderWorkQueue.Add(this);\n\t\t}\n\t\tCancelInvoke(ScheduledDeath);\n\t\tInvokeRepeating(InventoryUpdate, 1f, 0.1f * UnityEngine.Random.Range(0.99f, 1.01f));\n\t\tif (RelationshipManager.TeamsEnabled())\n\t\t{\n\t\t\tInvokeRandomized(TeamUpdate, 1f, 4f, 1f);\n\t\t}\n\t\tInvokeRandomized(UpdateClanLastSeen, 300f, 300f, 60f);\n\t\tEnablePlayerCollider();\n\t\tRefreshColliderSize(forced: true);\n\t\tAddPlayerRigidbody();\n\t\tSetServerFall(wantsOn: false);\n\t\tRunOfflineMetabolism(state: false);\n\t\tif (HasParent())\n\t\t{\n\t\t\tSetParent(null, worldPositionStays: true);\n\t\t\tRemoveFromTriggers();\n\t\t\tForceUpdateTriggers();\n\t\t}\n\t\tinventory.containerMain.OnChanged();\n\t\tinventory.containerBelt.OnChanged();\n\t\tinventory.containerWear.OnChanged();\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerSleepEnded\", this);\n\t\tEACServer.LogPlayerSpawn(this);\n\t\tif (TotalPingCount > 0)\n\t\t{\n\t\t\tSendPingsToClient();\n\t\t}\n\t\tif (TutorialIsland.ShouldPlayerBeAskedToStartTutorial(this))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"PromptToStartTutorial\", this));\n\t\t}\n\t\tif (AntiHack.TestNoClipping(this, base.transform.position, base.transform.position, NoClipRadius(ConVar.AntiHack.noclip_margin), ConVar.AntiHack.noclip_backtracking, out var _))\n\t\t{\n\t\t\tForceCastNoClip();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "EndSleeping",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3142903598,
      "Name": "OnPlayerMarkersSend",
      "FullName": "OnPlayerMarkersSend",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.MapNoteList",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player markers send occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendMarkersToClient()\n{\n\tusing ProtoBuf.MapNoteList mapNoteList = Facepunch.Pool.Get<ProtoBuf.MapNoteList>();\n\tmapNoteList.notes = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.MapNote>>();\n\tif (ServerCurrentDeathNote != null)\n\t{\n\t\tmapNoteList.notes.Add(ServerCurrentDeathNote);\n\t}\n\tif (State.pointsOfInterest != null)\n\t{\n\t\tmapNoteList.notes.AddRange(State.pointsOfInterest);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnPlayerMarkersSend\", this, mapNoteList);\n\tClientRPC(RpcTarget.Player(\"Client_ReceiveMarkers\", this), mapNoteList);\n\tmapNoteList.notes.Clear();\n}\n",
      "ParametersText": "BasePlayer basePlayer, ProtoBuf.MapNoteList local0",
      "TargetName": "BasePlayer",
      "MethodName": "SendMarkersToClient",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 372024025,
      "Name": "OnPlayerPingsSend",
      "FullName": "OnPlayerPingsSend",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.MapNoteList",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player pings send occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendPingsToClient()\n{\n\tusing ProtoBuf.MapNoteList mapNoteList = Facepunch.Pool.Get<ProtoBuf.MapNoteList>();\n\tmapNoteList.notes = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.MapNote>>();\n\tmapNoteList.notes.AddRange(State.pings);\n\tOxide.Core.Interface.CallHook(\"OnPlayerPingsSend\", this, mapNoteList);\n\tClientRPC(RpcTarget.Player(\"Client_ReceivePings\", this), mapNoteList);\n\tmapNoteList.notes.Clear();\n}\n",
      "ParametersText": "BasePlayer basePlayer, ProtoBuf.MapNoteList local0",
      "TargetName": "BasePlayer",
      "MethodName": "SendPingsToClient",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3273374899,
      "Name": "OnActiveTelephoneUpdated",
      "FullName": "OnActiveTelephoneUpdated [BasePlayer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an active telephone is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetActiveTelephone(PhoneController t)\n{\n\tactiveTelephone = t;\n\tOxide.Core.Interface.CallHook(\"OnActiveTelephoneUpdated\", this, t);\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "SetActiveTelephone",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1335676105,
      "Name": "OnPlayerRevive",
      "FullName": "OnPlayerRevive",
      "Category": "Player",
      "Parameters": [
        {
          "name": "fromPlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player revives."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnMedicalToolApplied(BasePlayer fromPlayer, ItemDefinition itemDef, ItemModConsumable consumable, MedicalTool medicalToolEntity, bool canRevive)\n{\n\tif (fromPlayer != this && IsWounded() && canRevive)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerRevive\", fromPlayer, this) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tStopWounded(fromPlayer);\n\t}\n\tforeach (ItemModConsumable.ConsumableEffect effect in consumable.effects)\n\t{\n\t\tif (effect.type == MetabolismAttribute.Type.Health)\n\t\t{\n\t\t\tbase.health += effect.amount;\n\t\t\tProcessMissionEvent(BaseMission.MissionEventType.HEAL, medicalToolEntity.prefabID, effect.amount);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmetabolism.ApplyChange(effect.type, effect.amount, effect.time);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer fromPlayer, BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "OnMedicalToolApplied",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 851821006,
      "Name": "OnFogOfWarStale",
      "FullName": "OnFogOfWarStale",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void OnFogOfWarStale()\n{\n\tClearFogList(GetFogImageList(BasePlayer.FogMode.Mainland));\n\tClearFogList(GetFogImageList(BasePlayer.FogMode.DeepSea));\n\tOxide.Core.Interface.CallHook(\"OnFogOfWarStale\", this);\n\tstatic void ClearFogList(System.Collections.Generic.List<uint> l)\n\t{\n\t\tl.Clear();\n\t\tfor (int i = 0; i < 16; i++)\n\t\t{\n\t\t\tl.Add(0u);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "OnFogOfWarStale",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3504441027,
      "Name": "OnFogOfWarCleared",
      "FullName": "OnFogOfWarCleared",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "mainland",
          "typeName": "System.Boolean",
          "optional": false
        },
        {
          "name": "deepSea",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ServerClearFog(bool mainland, bool deepSea)\n{\n\tif (mainland)\n\t{\n\t\tClearFogList(ref State.fogImagesMainland);\n\t}\n\tif (deepSea)\n\t{\n\t\tClearFogList(ref State.fogImagesDeepSea);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnFogOfWarCleared\", this, mainland, deepSea);\n\tDirtyPlayerState();\n\tSendFogImagesToClient();\n\tvoid ClearFogList(ref System.Collections.Generic.List<uint> fog)\n\t{\n\t\tif (fog == null || fog.Count != 16)\n\t\t{\n\t\t\tfog = Facepunch.Pool.Get<PooledList<uint>>();\n\t\t\tfor (int i = 0; i < 16; i++)\n\t\t\t{\n\t\t\t\tfog.Add(0u);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tfor (int j = 0; j < fog.Count; j++)\n\t\t\t{\n\t\t\t\tif (fog[j] != 0)\n\t\t\t\t{\n\t\t\t\t\tFileStorage.server.Remove(fog[j], FileStorage.Type.png, net.ID);\n\t\t\t\t\tfog[j] = 0u;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, bool mainland, bool deepSea",
      "TargetName": "BasePlayer",
      "MethodName": "ServerClearFog",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 148009165,
      "Name": "OnFogOfWarImageUpdate",
      "FullName": "OnFogOfWarImageUpdate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Byte",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Byte",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.UInt32",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.UInt32",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "System.Byte[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(16uL)]\npublic void FogImageUpdate(BaseEntity.RPCMessage msg)\n{\n\tbyte b = msg.read.UInt8();\n\tbyte b2 = msg.read.UInt8();\n\tuint num = msg.read.UInt32();\n\tuint num2 = msg.read.UInt32();\n\tif (num2 > 32)\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<uint> fogImageList = GetFogImageList();\n\tif (fogImageList.Count != 16)\n\t{\n\t\tfogImageList.Clear();\n\t\tfor (int i = 0; i < 16; i++)\n\t\t{\n\t\t\tfogImageList.Add(0u);\n\t\t}\n\t}\n\tif (b != 0 || fogImageList[b2] != num)\n\t{\n\t\tbyte[] array = msg.read.BytesWithSize();\n\t\tif (array != null && Oxide.Core.Interface.CallHook(\"OnFogOfWarImageUpdate\", this, b, b2, num, num2, array) == null)\n\t\t{\n\t\t\tFileStorage.server.RemoveEntityNum(net.ID, num2);\n\t\t\tuint value = FileStorage.server.Store(array, FileStorage.Type.png, net.ID, num2);\n\t\t\tfogImageList[b2] = value;\n\t\t\tDirtyPlayerState();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, System.Byte local0, System.Byte local1, uint local2, uint local3, System.Byte[] local5",
      "TargetName": "BasePlayer",
      "MethodName": "FogImageUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2708115276,
      "Name": "OnMapMarkerAdd",
      "FullName": "OnMapMarkerAdd",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a map marker is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.MapNote) })]\n[BaseEntity.RPC_Server.CallsPerSecond(8uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\npublic void Server_AddMarker(BaseEntity.RPCMessage msg)\n{\n\tProtoBuf.MapNote mapNote = msg.read.Proto<ProtoBuf.MapNote>();\n\tif (Oxide.Core.Interface.CallHook(\"OnMapMarkerAdd\", this, mapNote) != null || !CanUseMapMarkers)\n\t{\n\t\treturn;\n\t}\n\tif (State.pointsOfInterest == null)\n\t{\n\t\tState.pointsOfInterest = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.MapNote>>();\n\t}\n\tif (State.pointsOfInterest.Count >= ConVar.Server.maximumMapMarkers)\n\t{\n\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Short, MarkerLimitPhrase, false, ConVar.Server.maximumMapMarkers.ToString());\n\t\treturn;\n\t}\n\tif (mapNote.label == \"auto-name\")\n\t{\n\t\tint num = FindUnusedNumberName();\n\t\tif (num != -1)\n\t\t{\n\t\t\tmapNote.label = num.ToString();\n\t\t}\n\t}\n\tValidateMapNote(mapNote);\n\tif (mapNote.colourIndex == -1)\n\t{\n\t\tmapNote.colourIndex = FindUnusedPointOfInterestColour();\n\t}\n\tState.pointsOfInterest.Add(mapNote);\n\tDirtyPlayerState();\n\tSendMarkersToClient();\n\tTeamUpdate();\n\tOxide.Core.Interface.CallHook(\"OnMapMarkerAdded\", this, mapNote);\n}\n",
      "ParametersText": "",
      "TargetName": "BasePlayer",
      "MethodName": "Server_AddMarker",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3363707995,
      "Name": "OnMapMarkerAdd [patch]",
      "FullName": "OnMapMarkerAdd [patch]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.MapNote) })]\n[BaseEntity.RPC_Server.CallsPerSecond(8uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\npublic void Server_AddMarker(BaseEntity.RPCMessage msg)\n{\n\tProtoBuf.MapNote mapNote = msg.read.Proto<ProtoBuf.MapNote>();\n\tif (Oxide.Core.Interface.CallHook(\"OnMapMarkerAdd\", this, mapNote) != null || !CanUseMapMarkers)\n\t{\n\t\treturn;\n\t}\n\tif (State.pointsOfInterest == null)\n\t{\n\t\tState.pointsOfInterest = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.MapNote>>();\n\t}\n\tif (State.pointsOfInterest.Count >= ConVar.Server.maximumMapMarkers)\n\t{\n\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Short, MarkerLimitPhrase, false, ConVar.Server.maximumMapMarkers.ToString());\n\t\treturn;\n\t}\n\tif (mapNote.label == \"auto-name\")\n\t{\n\t\tint num = FindUnusedNumberName();\n\t\tif (num != -1)\n\t\t{\n\t\t\tmapNote.label = num.ToString();\n\t\t}\n\t}\n\tValidateMapNote(mapNote);\n\tif (mapNote.colourIndex == -1)\n\t{\n\t\tmapNote.colourIndex = FindUnusedPointOfInterestColour();\n\t}\n\tState.pointsOfInterest.Add(mapNote);\n\tDirtyPlayerState();\n\tSendMarkersToClient();\n\tTeamUpdate();\n\tOxide.Core.Interface.CallHook(\"OnMapMarkerAdded\", this, mapNote);\n}\n",
      "ParametersText": "",
      "TargetName": "BasePlayer",
      "MethodName": "Server_AddMarker",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2122008044,
      "Name": "OnPlayerCorpseSpawn",
      "FullName": "OnPlayerCorpseSpawn",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a player corpse is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual BaseCorpse CreateCorpse(BasePlayer.PlayerFlags flagsOnDeath, UnityEngine.Vector3 posOnDeath, UnityEngine.Quaternion rotOnDeath, System.Collections.Generic.List<TriggerBase> triggersOnDeath, bool forceServerSide = false)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerCorpseSpawn\", this) != null)\n\t{\n\t\treturn null;\n\t}\n\tusing (TimeWarning.New(\"Create corpse\"))\n\t{\n\t\tstring strCorpsePrefab = ((!(ConVar.Physics.serversideragdolls || forceServerSide)) ? \"assets/prefabs/player/player_corpse.prefab\" : \"assets/prefabs/player/player_corpse_new.prefab\");\n\t\tbool flag = false;\n\t\tif (ConVar.Global.cinematicGingerbreadCorpses)\n\t\t{\n\t\t\tforeach (Item item in inventory.containerWear.itemList)\n\t\t\t{\n\t\t\t\tif (item != null && item.info.TryGetComponent<ItemCorpseOverride>(out var component))\n\t\t\t\t{\n\t\t\t\t\tstrCorpsePrefab = ((GetFloatBasedOnUserID(userID, 4332uL) > 0.5f) ? component.FemaleCorpse.resourcePath : component.MaleCorpse.resourcePath);\n\t\t\t\t\tflag = component.BlockWearableCopy;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tPlayerCorpse playerCorpse = DropCorpse(strCorpsePrefab, posOnDeath, rotOnDeath, flagsOnDeath, modelState) as PlayerCorpse;\n\t\tif ((bool)playerCorpse)\n\t\t{\n\t\t\tplayerCorpse.SetFlag(BaseEntity.Flags.Reserved5, HasPlayerFlag(BasePlayer.PlayerFlags.DisplaySash));\n\t\t\tif (!flag)\n\t\t\t{\n\t\t\t\tplayerCorpse.TakeFrom(this, inventory.containerMain, inventory.containerWear, inventory.containerBelt);\n\t\t\t}\n\t\t\tplayerCorpse.playerName = displayName;\n\t\t\tplayerCorpse.streamerName = Facepunch.RandomUsernames.Get(userID);\n\t\t\tplayerCorpse.playerSteamID = userID;\n\t\t\tplayerCorpse.underwearSkin = GetUnderwearSkin();\n\t\t\tif (!CollectionEx.IsNullOrEmpty(triggersOnDeath))\n\t\t\t{\n\t\t\t\tforeach (TriggerBase item2 in triggersOnDeath)\n\t\t\t\t{\n\t\t\t\t\tif (item2 is TriggerParent triggerParent)\n\t\t\t\t\t{\n\t\t\t\t\t\ttriggerParent.ForceParentEarly(playerCorpse);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tplayerCorpse.Spawn();\n\t\t\tplayerCorpse.TakeChildren(this);\n\t\t\tResourceDispenser component2 = playerCorpse.GetComponent<ResourceDispenser>();\n\t\t\tint num = 2;\n\t\t\tif (lifeStory != null)\n\t\t\t{\n\t\t\t\tnum += UnityEngine.Mathf.Clamp(UnityEngine.Mathf.FloorToInt(lifeStory.secondsAlive / 180f), 0, 20);\n\t\t\t}\n\t\t\tcomponent2.containedItems.Add(new ItemAmount(ItemManager.FindItemDefinition(\"fat.animal\"), num));\n\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerCorpseSpawned\", this, playerCorpse);\n\t\t\treturn playerCorpse;\n\t\t}\n\t}\n\treturn null;\n\tstatic float GetFloatBasedOnUserID(ulong steamid, ulong seed)\n\t{\n\t\tUnityEngine.Random.State state = UnityEngine.Random.state;\n\t\tUnityEngine.Random.InitState((int)(seed + steamid));\n\t\tfloat result = UnityEngine.Random.Range(0f, 1f);\n\t\tUnityEngine.Random.state = state;\n\t\treturn result;\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "BasePlayer",
      "MethodName": "CreateCorpse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3702793864,
      "Name": "OnSendModelState",
      "FullName": "OnSendModelState",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when send model state occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendModelState(bool force = false)\n{\n\tif (force || lastModelState == null || HasModelStateChanged())\n\t{\n\t\tif (lastModelState == null)\n\t\t{\n\t\t\tlastModelState = modelState.Copy();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tmodelState.CopyTo(lastModelState);\n\t\t}\n\t\tif (!base.limitNetworking && Oxide.Core.Interface.CallHook(\"OnSendModelState\", this) == null)\n\t\t{\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"OnModelState\"), modelState);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "BasePlayer",
      "MethodName": "SendModelState",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1948488445,
      "Name": "OnRunPlayerMetabolism",
      "FullName": "OnRunPlayerMetabolism",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerMetabolism",
          "typeName": "PlayerMetabolism",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when run player metabolism occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected override void RunMetabolism(BaseCombatEntity ownerEntity, float delta)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnRunPlayerMetabolism\", this, ownerEntity, delta) != null)\n\t{\n\t\treturn;\n\t}\n\tif (owner.IsConnected)\n\t{\n\t\tBaseGameMode activeGameMode = BaseGameMode.GetActiveGameMode(serverside: true);\n\t\tfloat num = owner.currentTemperature;\n\t\tfloat fTarget = owner.currentComfort;\n\t\tUpdateWorkbenchFlags();\n\t\towner.SetPlayerFlag(BasePlayer.PlayerFlags.SafeZone, owner.InSafeZone());\n\t\towner.SetPlayerFlag(BasePlayer.PlayerFlags.NoRespawnZone, owner.InNoRespawnZone());\n\t\towner.SetPlayerFlag(BasePlayer.PlayerFlags.ModifyClan, ConVar.Clan.editsRequireClanTable && owner.CanModifyClan());\n\t\tbool num2 = activeGameMode == null || activeGameMode.allowTemperature;\n\t\tif (owner.IsInTutorial)\n\t\t{\n\t\t\tnum = 25f;\n\t\t}\n\t\tif (num2)\n\t\t{\n\t\t\tfloat num3 = num + GetCoreTempAdjustment() - DeltaWet() * 34f;\n\t\t\tfloat num4 = UnityEngine.Mathf.Clamp(owner.baseProtection.amounts[18] * 1.5f, -1f, 1f);\n\t\t\tfloat num5 = UnityEngine.Mathf.InverseLerp(20f, -50f, num);\n\t\t\tfloat num6 = UnityEngine.Mathf.InverseLerp(20f, 30f, num);\n\t\t\tfloat fTarget2 = UnityEngine.Mathf.Clamp(num3 + num5 * 70f * num4 + num6 * 10f * UnityEngine.Mathf.Abs(num4) + heartrate.value * 5f, GetCoreTempMin(), GetCoreTempMax());\n\t\t\ttemperature.MoveTowards(fTarget2, delta * 5f);\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttemperature.value = 25f;\n\t\t}\n\t\tif (temperature.value >= 40f)\n\t\t{\n\t\t\tfTarget = 0f;\n\t\t}\n\t\tcomfort.MoveTowards(fTarget, delta / 5f);\n\t\tfloat num7 = 0.6f + 0.4f * comfort.value;\n\t\tif (calories.value > 100f && owner.healthFraction < num7 && radiation_poison.Fraction() < 0.25f && owner.SecondsSinceAttacked > 10f && !SignificantBleeding() && temperature.value >= 10f && hydration.value > 40f)\n\t\t{\n\t\t\tfloat num8 = UnityEngine.Mathf.InverseLerp(calories.min, calories.max, calories.value);\n\t\t\tfloat num9 = 5f;\n\t\t\tfloat num10 = num9 * owner.MaxHealth() * 0.8f / 600f;\n\t\t\tnum10 += num10 * num8 * 0.5f;\n\t\t\tfloat num11 = num10 / num9;\n\t\t\tnum11 += num11 * comfort.value * 6f;\n\t\t\townerEntity.Heal(num11 * delta);\n\t\t\tcalories.Subtract(num10 * delta);\n\t\t\thydration.Subtract(num10 * delta * 0.2f);\n\t\t}\n\t\tfloat num12 = owner.estimatedSpeed2D / owner.GetMaxSpeed() * 0.75f;\n\t\tfloat fTarget3 = UnityEngine.Mathf.Clamp(0.05f + num12, 0f, 1f);\n\t\theartrate.MoveTowards(fTarget3, delta * 0.1f);\n\t\tif (!owner.IsGod())\n\t\t{\n\t\t\tfloat num13 = heartrate.Fraction() * 0.375f;\n\t\t\tcalories.MoveTowards(0f, delta * num13);\n\t\t\tfloat num14 = 1f / 120f;\n\t\t\tnum14 += UnityEngine.Mathf.InverseLerp(40f, 60f, temperature.value) * (1f / 12f);\n\t\t\tnum14 += heartrate.value * (1f / 15f);\n\t\t\thydration.MoveTowards(0f, delta * num14);\n\t\t}\n\t\tbool b = hydration.Fraction() <= 0f || radiation_poison.value >= 100f;\n\t\towner.SetPlayerFlag(BasePlayer.PlayerFlags.NoSprint, b);\n\t\tif (temperature.value > 40f)\n\t\t{\n\t\t\thydration.Add(UnityEngine.Mathf.InverseLerp(40f, 200f, temperature.value) * delta * -1f);\n\t\t}\n\t\tif (temperature.value < 10f)\n\t\t{\n\t\t\tfloat num15 = UnityEngine.Mathf.InverseLerp(20f, -100f, temperature.value);\n\t\t\theartrate.MoveTowards(UnityEngine.Mathf.Lerp(0.2f, 1f, num15), delta * 2f * num15);\n\t\t}\n\t\tfloat f = 0f;\n\t\tfloat f2 = 0f;\n\t\tif (owner.IsOutside(owner.eyes.position))\n\t\t{\n\t\t\tf = Climate.GetRain(owner.eyes.position) * ConVar.Weather.wetness_rain;\n\t\t\tf2 = Climate.GetSnow(owner.eyes.position) * ConVar.Weather.wetness_snow;\n\t\t}\n\t\tbool flag = owner.baseProtection.amounts[4] > 0f;\n\t\tfloat currentEnvironmentalWetness = owner.currentEnvironmentalWetness;\n\t\tcurrentEnvironmentalWetness = UnityEngine.Mathf.Clamp(currentEnvironmentalWetness, 0f, 0.8f);\n\t\tfloat num16 = owner.WaterFactor();\n\t\tif (!flag && num16 > 0f)\n\t\t{\n\t\t\twetness.value = UnityEngine.Mathf.Max(wetness.value, UnityEngine.Mathf.Clamp(num16, wetness.min, wetness.max));\n\t\t}\n\t\tfloat num17 = Mathx.Max(wetness.value, f, f2, currentEnvironmentalWetness);\n\t\tnum17 = UnityEngine.Mathf.Min(num17, flag ? 0f : num17);\n\t\twetness.MoveTowards(num17, delta * 0.05f);\n\t\tif (num16 < wetness.value && currentEnvironmentalWetness <= 0f)\n\t\t{\n\t\t\twetness.MoveTowards(0f, delta * 0.2f * UnityEngine.Mathf.InverseLerp(0f, 100f, num));\n\t\t}\n\t\tpoison.MoveTowards(0f, delta * (5f / 9f));\n\t\tif (wetness.Fraction() > 0.4f && owner.estimatedSpeed > 0.25f && radiation_level.Fraction() == 0f)\n\t\t{\n\t\t\tradiation_poison.Subtract(radiation_poison.value * 0.2f * wetness.Fraction() * delta * 0.2f);\n\t\t}\n\t\tif (ConVar.Server.radiation)\n\t\t{\n\t\t\tif (!owner.IsGod())\n\t\t\t{\n\t\t\t\tfloat radiationAfterProtection = Radiation.GetRadiationAfterProtection(owner.modifiers.GetValue(Modifier.ModifierType.Radiation), ownerEntity.RadiationProtection());\n\t\t\t\tradiation_level.value = owner.radiationLevel + radiationAfterProtection;\n\t\t\t\tif (radiation_level.value > 0f)\n\t\t\t\t{\n\t\t\t\t\tradiation_poison.Add(radiation_level.value * delta);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (radiation_level.value > 0f)\n\t\t\t{\n\t\t\t\tradiation_level.value = 0f;\n\t\t\t\tradiation_poison.value = 0f;\n\t\t\t}\n\t\t}\n\t\tif (pending_health.value > 0f)\n\t\t{\n\t\t\tfloat num18 = 1f + owner.modifiers.GetValue(Modifier.ModifierType.MetabolismBooster);\n\t\t\tfloat num19 = UnityEngine.Mathf.Min(1f * delta * num18, pending_health.value);\n\t\t\townerEntity.Heal(num19);\n\t\t\tif (ownerEntity.healthFraction == 1f)\n\t\t\t{\n\t\t\t\tpending_health.value = 0f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpending_health.Subtract(num19);\n\t\t\t}\n\t\t}\n\t}\n\tfloat num20 = owner.AirFactor();\n\tfloat num21 = ((num20 > oxygen.value) ? 1f : 0.1f);\n\toxygen.MoveTowards(num20, delta * num21);\n}\n",
      "ParametersText": "PlayerMetabolism playerMetabolism",
      "TargetName": "PlayerMetabolism",
      "MethodName": "RunMetabolism",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 367386711,
      "Name": "OnPlayerMetabolize",
      "FullName": "OnPlayerMetabolize",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerMetabolism",
          "typeName": "PlayerMetabolism",
          "optional": false
        },
        {
          "name": "ownerEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        },
        {
          "name": "delta",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player metabolize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ServerUpdate(BaseCombatEntity ownerEntity, float delta)\n{\n\tbase.ServerUpdate(ownerEntity, delta);\n\tOxide.Core.Interface.CallHook(\"OnPlayerMetabolize\", this, ownerEntity, delta);\n\tusing (TimeWarning.New(\"PlayerMetabolism.ServerUpdate\"))\n\t{\n\t\tif (owner.IsConnected)\n\t\t{\n\t\t\tSendChanges();\n\t\t}\n\t}\n}\n",
      "ParametersText": "PlayerMetabolism playerMetabolism, BaseCombatEntity ownerEntity, float delta",
      "TargetName": "PlayerMetabolism",
      "MethodName": "ServerUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1024438622,
      "Name": "CanUpdateSign",
      "FullName": "CanUpdateSign [Signage]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "signage",
          "typeName": "Signage",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to update sign.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanUpdateSign(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUpdateSign\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player.IsAdmin || player.IsDeveloper)\n\t{\n\t\treturn true;\n\t}\n\tif (!player.CanBuild())\n\t{\n\t\treturn false;\n\t}\n\tif (IsLocked())\n\t{\n\t\treturn (ulong)player.userID == base.OwnerID;\n\t}\n\tif (!HeldEntityCheck(player))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, Signage signage",
      "TargetName": "Signage",
      "MethodName": "CanUpdateSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3553459634,
      "Name": "CanResearchItem",
      "FullName": "CanResearchItem",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to research item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void DoResearch(BaseEntity.RPCMessage msg)\n{\n\tif (IsResearching())\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tItem targetItem = GetTargetItem();\n\tif (targetItem != null && Oxide.Core.Interface.CallHook(\"CanResearchItem\", player, targetItem) == null && targetItem.amount <= 1 && IsItemResearchable(targetItem))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnItemResearch\", this, targetItem, player);\n\t\ttargetItem.CollectedForCrafting(player);\n\t\tresearchFinishedTime = UnityEngine.Time.realtimeSinceStartup + researchDuration;\n\t\tInvoke(ResearchAttemptFinished, researchDuration);\n\t\tbase.inventory.SetLocked(isLocked: true);\n\t\tint scrapCost = ScrapForResearch(targetItem);\n\t\tFacepunch.Rust.Analytics.Azure.OnResearchStarted(player, this, targetItem, scrapCost);\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tSendNetworkUpdate();\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tif (researchStartEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(researchStartEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t\tmsg.player.GiveAchievement(\"RESEARCH_ITEM\");\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, Item local1",
      "TargetName": "ResearchTable",
      "MethodName": "DoResearch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1065566406,
      "Name": "CanBeTargeted",
      "FullName": "CanBeTargeted [AutoTurret]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "BaseCombatEntity",
          "optional": false
        },
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool ObjectVisible(BaseCombatEntity obj)\n{\n\tobject obj2 = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", obj, this);\n\tif (obj2 is bool)\n\t{\n\t\treturn (bool)obj2;\n\t}\n\tUnityEngine.Vector3 position = eyePos.transform.position;\n\tif (GamePhysics.CheckSphere(position, 0.1f, 136314880))\n\t{\n\t\treturn false;\n\t}\n\tUnityEngine.Vector3 vector = AimOffset(obj);\n\tfloat num = UnityEngine.Vector3.Distance(vector, position);\n\tUnityEngine.Vector3 vector2 = UnityEngine.Vector3.Cross((vector - position).normalized, UnityEngine.Vector3.up);\n\tif (num > sightRange)\n\t{\n\t\treturn false;\n\t}\n\tSystem.Collections.Generic.List<UnityEngine.RaycastHit> obj3 = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.RaycastHit>>();\n\tint num2 = ((!(obj is BasePlayer)) ? 1 : 3);\n\tfor (int i = 0; i < num2; i++)\n\t{\n\t\tUnityEngine.Vector3 normalized = (vector + vector2 * visibilityOffsets[i] - position).normalized;\n\t\tobj3.Clear();\n\t\tGamePhysics.TraceAll(new UnityEngine.Ray(position, normalized), 0f, obj3, num * 1.1f, 1218652417);\n\t\tfor (int j = 0; j < obj3.Count; j++)\n\t\t{\n\t\t\tBaseEntity entity = RaycastHitEx.GetEntity(obj3[j]);\n\t\t\tif ((!(entity != null) || !entity.isClient) && (!(entity != null) || !(entity.ToPlayer() != null) || entity.EqualNetID(obj)) && (!(entity != null) || !entity.EqualNetID(this)))\n\t\t\t{\n\t\t\t\tif (entity != null && (entity == obj || entity.EqualNetID(obj)))\n\t\t\t\t{\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj3);\n\t\t\t\t\tpeekIndex = i;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (!(entity != null) || entity.ShouldBlockProjectiles())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj3);\n\treturn false;\n}\n",
      "ParametersText": "BaseCombatEntity obj, AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "ObjectVisible",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1065566406,
      "Name": "CanBeTargeted",
      "FullName": "CanBeTargeted [HelicopterTurret]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "potentialtarget",
          "typeName": "BaseCombatEntity",
          "optional": false
        },
        {
          "name": "helicopterTurret",
          "typeName": "HelicopterTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool InFiringArc(BaseCombatEntity potentialtarget)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", potentialtarget, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn AngleToTarget(potentialtarget) < 80f;\n}\n",
      "ParametersText": "BaseCombatEntity potentialtarget, HelicopterTurret helicopterTurret",
      "TargetName": "HelicopterTurret",
      "MethodName": "InFiringArc",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3392492984,
      "Name": "OnLootEntityEnd",
      "FullName": "OnLootEntityEnd [LootableCorpse]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "lootableCorpse",
          "typeName": "LootableCorpse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot entity ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PlayerStoppedLooting(BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnLootEntityEnd\", player, this);\n\tResetRemovalTime();\n\tSetFlag(BaseEntity.Flags.Open, b: false);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, LootableCorpse lootableCorpse",
      "TargetName": "LootableCorpse",
      "MethodName": "PlayerStoppedLooting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [LootableCorpse]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "lootableCorpse",
          "typeName": "LootableCorpse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_LootCorpse(BaseEntity.RPCMessage rpc)\n{\n\tBasePlayer player = rpc.player;\n\tif (!player || !player.CanInteract() || !CanLoot() || containers == null || Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) != null || !player.inventory.loot.StartLootingEntity(this))\n\t{\n\t\treturn;\n\t}\n\tSetFlag(BaseEntity.Flags.Open, b: true);\n\tfor (int i = 0; i < containers.Length; i++)\n\t{\n\t\tItemContainer itemContainer = containers[i];\n\t\tif (CanLootContainer(itemContainer, i))\n\t\t{\n\t\t\tplayer.inventory.loot.AddContainer(itemContainer);\n\t\t}\n\t}\n\tplayer.inventory.loot.SendImmediate();\n\tplayer.RadioactiveLootCheck(player.inventory.loot.containers);\n\tClientRPC(RpcTarget.Player(\"RPC_ClientLootCorpse\", player));\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer local0, LootableCorpse lootableCorpse",
      "TargetName": "LootableCorpse",
      "MethodName": "RPC_LootCorpse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3392492984,
      "Name": "OnLootEntityEnd",
      "FullName": "OnLootEntityEnd [StorageContainer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "storageContainer",
          "typeName": "StorageContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot entity ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void PlayerStoppedLooting(BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnLootEntityEnd\", player, this);\n\tSetFlag(BaseEntity.Flags.Open, b: false);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, StorageContainer storageContainer",
      "TargetName": "StorageContainer",
      "MethodName": "PlayerStoppedLooting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [StorageContainer]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool PlayerOpenLoot(BasePlayer player, string panelToOpen = \"\", bool doPositionChecks = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) != null)\n\t{\n\t\treturn false;\n\t}\n\tif (IsLocked() || IsTransferring())\n\t{\n\t\tplayer.ShowToast(GameTip.Styles.Red_Normal, LockedMessage, false);\n\t\treturn false;\n\t}\n\tif (onlyOneUser && IsOpen())\n\t{\n\t\tplayer.ShowToast(GameTip.Styles.Red_Normal, InUseMessage, false);\n\t\treturn false;\n\t}\n\tif (panelToOpen == \"\")\n\t{\n\t\tpanelToOpen = panelName;\n\t}\n\tif (!CanOpenLootPanel(player, panelToOpen))\n\t{\n\t\treturn false;\n\t}\n\tif (player.inventory.loot.StartLootingEntity(this, doPositionChecks))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Open, b: true);\n\t\tAddContainers(player.inventory.loot);\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), panelToOpen);\n\t\tSendNetworkUpdate();\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "StorageContainer",
      "MethodName": "PlayerOpenLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3447551367,
      "Name": "CanBypassQueue",
      "FullName": "CanBypassQueue",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to bypass queue.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool CanJumpQueue(Network.Connection connection)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBypassQueue\", connection);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (DeveloperList.Contains(connection.userid))\n\t{\n\t\treturn true;\n\t}\n\tServerUsers.User user = ServerUsers.Get(connection.userid);\n\tif (user != null && user.group == ServerUsers.UserGroup.Moderator)\n\t{\n\t\treturn true;\n\t}\n\tif (user != null && user.group == ServerUsers.UserGroup.Owner)\n\t{\n\t\treturn true;\n\t}\n\tif (user != null && user.group == ServerUsers.UserGroup.SkipQueue)\n\t{\n\t\treturn true;\n\t}\n\tfor (int i = 0; i < reservedSlots.Count; i++)\n\t{\n\t\tif (reservedSlots[i].UserId == connection.userid && reservedSlots[i].Expiry > UnityEngine.Time.realtimeSinceStartup)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "ConnectionQueue",
      "MethodName": "CanJumpQueue",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1065566406,
      "Name": "CanBeTargeted",
      "FullName": "CanBeTargeted [FlameTurret]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local7",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "flameTurret",
          "typeName": "FlameTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CheckTrigger()\n{\n\tif (UnityEngine.Time.realtimeSinceStartup < nextTriggerCheckTime)\n\t{\n\t\treturn false;\n\t}\n\tnextTriggerCheckTime = UnityEngine.Time.realtimeSinceStartup + 1f / triggerCheckRate;\n\tSystem.Collections.Generic.List<UnityEngine.RaycastHit> obj = null;\n\ttry\n\t{\n\t\tSystem.Collections.Generic.HashSet<BaseEntity> entityContents = trigger.entityContents;\n\t\tif (entityContents == null || entityContents.Count == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tIPrivilege privilege = null;\n\t\tforeach (BaseEntity item in entityContents)\n\t\t{\n\t\t\tBasePlayer basePlayer = item as BasePlayer;\n\t\t\tif (basePlayer == null || basePlayer.IsSleeping() || !basePlayer.IsAlive() || basePlayer.transform.position.y > GetEyePosition().y + 0.5f)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", basePlayer, this);\n\t\t\tif (obj2 is bool)\n\t\t\t{\n\t\t\t\tif (obj != null)\n\t\t\t\t{\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t\t\t}\n\t\t\t\treturn (bool)obj2;\n\t\t\t}\n\t\t\tif (!flag2)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t\tprivilege = GetCachedPrivilege();\n\t\t\t}\n\t\t\tif (privilege != null && privilege.IsAuthed(basePlayer))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (obj == null)\n\t\t\t{\n\t\t\t\tobj = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.RaycastHit>>();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tobj.Clear();\n\t\t\t}\n\t\t\tGamePhysics.TraceAll(new UnityEngine.Ray(basePlayer.eyes.position, (GetEyePosition() - basePlayer.eyes.position).normalized), 0f, obj, 9f, 1218519297);\n\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t{\n\t\t\t\tBaseEntity entity = RaycastHitEx.GetEntity(obj[i]);\n\t\t\t\tif (entity != null && (entity == this || entity.EqualNetID(this)))\n\t\t\t\t{\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!(entity != null) || entity.ShouldBlockProjectiles())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn flag;\n\t}\n\tfinally\n\t{\n\t\tif (obj != null)\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer local7, FlameTurret flameTurret",
      "TargetName": "FlameTurret",
      "MethodName": "CheckTrigger",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 996121019,
      "Name": "CanBeTargeted [patch]",
      "FullName": "CanBeTargeted [FlameTurret] [cleanup]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CheckTrigger()\n{\n\tif (UnityEngine.Time.realtimeSinceStartup < nextTriggerCheckTime)\n\t{\n\t\treturn false;\n\t}\n\tnextTriggerCheckTime = UnityEngine.Time.realtimeSinceStartup + 1f / triggerCheckRate;\n\tSystem.Collections.Generic.List<UnityEngine.RaycastHit> obj = null;\n\ttry\n\t{\n\t\tSystem.Collections.Generic.HashSet<BaseEntity> entityContents = trigger.entityContents;\n\t\tif (entityContents == null || entityContents.Count == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tIPrivilege privilege = null;\n\t\tforeach (BaseEntity item in entityContents)\n\t\t{\n\t\t\tBasePlayer basePlayer = item as BasePlayer;\n\t\t\tif (basePlayer == null || basePlayer.IsSleeping() || !basePlayer.IsAlive() || basePlayer.transform.position.y > GetEyePosition().y + 0.5f)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", basePlayer, this);\n\t\t\tif (obj2 is bool)\n\t\t\t{\n\t\t\t\tif (obj != null)\n\t\t\t\t{\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t\t\t}\n\t\t\t\treturn (bool)obj2;\n\t\t\t}\n\t\t\tif (!flag2)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t\tprivilege = GetCachedPrivilege();\n\t\t\t}\n\t\t\tif (privilege != null && privilege.IsAuthed(basePlayer))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (obj == null)\n\t\t\t{\n\t\t\t\tobj = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.RaycastHit>>();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tobj.Clear();\n\t\t\t}\n\t\t\tGamePhysics.TraceAll(new UnityEngine.Ray(basePlayer.eyes.position, (GetEyePosition() - basePlayer.eyes.position).normalized), 0f, obj, 9f, 1218519297);\n\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t{\n\t\t\t\tBaseEntity entity = RaycastHitEx.GetEntity(obj[i]);\n\t\t\t\tif (entity != null && (entity == this || entity.EqualNetID(this)))\n\t\t\t\t{\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!(entity != null) || entity.ShouldBlockProjectiles())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn flag;\n\t}\n\tfinally\n\t{\n\t\tif (obj != null)\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "FlameTurret",
      "MethodName": "CheckTrigger",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 861710679,
      "Name": "CanPickupEntity",
      "FullName": "CanPickupEntity",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseCombatEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to pickup entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected virtual bool CanCompletePickup(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanPickupEntity\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, BaseCombatEntity baseCombatEntity",
      "TargetName": "BaseCombatEntity",
      "MethodName": "CanCompletePickup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1589203649,
      "Name": "CanAssignBed",
      "FullName": "CanAssignBed",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "sleepingBag",
          "typeName": "SleepingBag",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to assign is bed.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void AssignToFriend(BaseEntity.RPCMessage msg)\n{\n\tif (!msg.player.CanInteract() || deployerUserID != (ulong)msg.player.userID || !canReassignToFriends)\n\t{\n\t\treturn;\n\t}\n\tulong num = msg.read.UInt64();\n\tif (num == 0L || Oxide.Core.Interface.CallHook(\"CanAssignBed\", msg.player, this, num) != null)\n\t{\n\t\treturn;\n\t}\n\tif (ConVar.Server.max_sleeping_bags > 0)\n\t{\n\t\tSleepingBag.CanAssignBedResult? canAssignBedResult = CanAssignBed(msg.player, this, num);\n\t\tif (canAssignBedResult.HasValue)\n\t\t{\n\t\t\tBasePlayer basePlayer = RelationshipManager.FindByID(num);\n\t\t\tif (canAssignBedResult.Value.Result == SleepingBag.BagResultType.TooManyBags)\n\t\t\t{\n\t\t\t\tif (basePlayer == null)\n\t\t\t\t{\n\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, cannotAssignBedNoPlayerPhrase, false);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstring playerNameStreamSafe = NameHelper.GetPlayerNameStreamSafe(msg.player, basePlayer);\n\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, cannotAssignBedPhrase, false, playerNameStreamSafe);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (canAssignBedResult.Value.Result == SleepingBag.BagResultType.BagBlocked)\n\t\t\t{\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, bedAssigningBlocked, false);\n\t\t\t}\n\t\t\telse if (canAssignBedResult.Value.Result == SleepingBag.BagResultType.TargetIsPlayingTutorial)\n\t\t\t{\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, tutorialPhrase, false);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbasePlayer?.ShowToast(GameTip.Styles.Blue_Long, assignedBagPhrase, false, canAssignBedResult.Value.Count.ToString(), canAssignBedResult.Value.Max.ToString());\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Long, bagLimitPhrase, false, (GetSleepingBagCount(msg.player.userID) - 1).ToString(), canAssignBedResult.Value.Max.ToString());\n\t\t\t\tSendNetworkUpdate();\n\t\t\t}\n\t\t\tif (canAssignBedResult.Value.Result != 0)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tulong num2 = deployerUserID;\n\tdeployerUserID = num;\n\tOnBagChangedOwnership(this, num2);\n\tNotifyPlayer(num2);\n\tNotifyPlayer(deployerUserID);\n\tFacepunch.Rust.Analytics.Azure.OnSleepingBagAssigned(msg.player, this, num);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, SleepingBag sleepingBag, ulong local0",
      "TargetName": "SleepingBag",
      "MethodName": "AssignToFriend",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1894874021,
      "Name": "CanSetBedPublic",
      "FullName": "CanSetBedPublic",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "sleepingBag",
          "typeName": "SleepingBag",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to set bed public.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic virtual void RPC_MakePublic(BaseEntity.RPCMessage msg)\n{\n\tif (!canBePublic || !msg.player.CanInteract() || (deployerUserID != (ulong)msg.player.userID && !msg.player.CanBuild()))\n\t{\n\t\treturn;\n\t}\n\tbool flag = msg.read.Bit();\n\tif (flag == IsPublic() || Oxide.Core.Interface.CallHook(\"CanSetBedPublic\", msg.player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tSetPublic(flag);\n\tif (!IsPublic())\n\t{\n\t\tif (ConVar.Server.max_sleeping_bags > 0)\n\t\t{\n\t\t\tSleepingBag.CanAssignBedResult? canAssignBedResult = CanAssignBed(msg.player, this, msg.player.userID, 1, 0, this);\n\t\t\tif (canAssignBedResult.HasValue)\n\t\t\t{\n\t\t\t\tif (canAssignBedResult.Value.Result == SleepingBag.BagResultType.Ok)\n\t\t\t\t{\n\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Long, bagLimitPhrase, false, canAssignBedResult.Value.Count.ToString(), canAssignBedResult.Value.Max.ToString());\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Blue_Long, cannotMakeBedPhrase, false, canAssignBedResult.Value.Count.ToString(), canAssignBedResult.Value.Max.ToString());\n\t\t\t\t}\n\t\t\t\tif (canAssignBedResult.Value.Result != 0)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tulong num = deployerUserID;\n\t\tdeployerUserID = msg.player.userID;\n\t\tOnBagChangedOwnership(this, num);\n\t\tNotifyPlayer(num);\n\t\tNotifyPlayer(deployerUserID);\n\t\tFacepunch.Rust.Analytics.Azure.OnSleepingBagAssigned(msg.player, this, deployerUserID = msg.player.userID);\n\t}\n\telse\n\t{\n\t\tFacepunch.Rust.Analytics.Azure.OnSleepingBagAssigned(msg.player, this, 0uL);\n\t}\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, SleepingBag sleepingBag",
      "TargetName": "SleepingBag",
      "MethodName": "RPC_MakePublic",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 933436111,
      "Name": "CanRenameBed",
      "FullName": "CanRenameBed",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "sleepingBag",
          "typeName": "SleepingBag",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to rename is bed.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void Rename(BaseEntity.RPCMessage msg)\n{\n\tif (!msg.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tstring text = msg.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"CanRenameBed\", msg.player, this, text) == null)\n\t{\n\t\ttext = WordFilter.Filter(text);\n\t\tif (string.IsNullOrEmpty(text))\n\t\t{\n\t\t\ttext = \"Unnamed Sleeping Bag\";\n\t\t}\n\t\tif (text.Length > 24)\n\t\t{\n\t\t\ttext = text.Substring(0, 22) + \"..\";\n\t\t}\n\t\tniceName = text;\n\t\tSendNetworkUpdate();\n\t\tNotifyPlayer(deployerUserID);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, SleepingBag sleepingBag, string local0",
      "TargetName": "SleepingBag",
      "MethodName": "Rename",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1546340674,
      "Name": "OnPlayerRespawn",
      "FullName": "OnPlayerRespawn [SleepingBag]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "SleepingBag",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player respawns."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool SpawnPlayer(BasePlayer player, NetworkableId sleepingBag)\n{\n\tusing PooledList<SleepingBag> pooledList = FindForPlayer(player.userID);\n\tSleepingBag sleepingBag2 = null;\n\tforeach (SleepingBag item in pooledList)\n\t{\n\t\tif (item.ValidForPlayer(player.userID, ignoreTimers: false) && item.net.ID == sleepingBag && item.unlockTime < UnityEngine.Time.realtimeSinceStartup)\n\t\t{\n\t\t\tsleepingBag2 = item;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (sleepingBag2 == null)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnPlayerRespawn\", player, sleepingBag2);\n\tif (obj is SleepingBag)\n\t{\n\t\tsleepingBag2 = (SleepingBag)obj;\n\t}\n\tif (sleepingBag2 is StaticRespawnArea staticRespawnArea && !staticRespawnArea.IsAuthed(player.userID))\n\t{\n\t\treturn false;\n\t}\n\tif (sleepingBag2.GetRespawnState(player.userID) != ProtoBuf.RespawnInformation.SpawnOptions.RespawnState.OK)\n\t{\n\t\treturn false;\n\t}\n\tsleepingBag2.GetSpawnPos(out var pos, out var rot);\n\tplayer.RespawnAt(pos, rot, sleepingBag2);\n\tsleepingBag2.PostPlayerSpawn(player);\n\tforeach (SleepingBag item2 in pooledList)\n\t{\n\t\tSetBagTimer(item2, pos, SleepingBag.SleepingBagResetReason.Respawned, player);\n\t}\n\tif (sleepingBag2.HasFlag(BaseEntity.Flags.Reserved14))\n\t{\n\t\tsleepingBag2.Kill();\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, SleepingBag local1",
      "TargetName": "SleepingBag",
      "MethodName": "SpawnPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 425492667,
      "Name": "CanHideStash",
      "FullName": "CanHideStash",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "stashContainer",
          "typeName": "StashContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to hide stash.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_HideStash(BaseEntity.RPCMessage rpc)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanHideStash\", rpc.player, this) == null)\n\t{\n\t\tFacepunch.Rust.Analytics.Azure.OnStashHidden(rpc.player, this);\n\t\tSetHidden(isHidden: true);\n\t\tOxide.Core.Interface.CallHook(\"OnStashHidden\", this, rpc.player);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, StashContainer stashContainer",
      "TargetName": "StashContainer",
      "MethodName": "RPC_HideStash",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1356028081,
      "Name": "OnPlayerViolation",
      "FullName": "OnPlayerViolation",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when player violation occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void AddViolation(BasePlayer ply, AntiHackType type, float amount, UnityEngine.GameObject gameObject = null)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerViolation\", ply, type, amount, gameObject) != null)\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"AntiHack.AddViolation\"))\n\t{\n\t\tply.lastViolationType = type;\n\t\tply.lastViolationTime = UnityEngine.Time.realtimeSinceStartup;\n\t\tply.violationLevel += amount;\n\t\tif (type == AntiHackType.NoClip || type == AntiHackType.FlyHack || type == AntiHackType.SpeedHack || type == AntiHackType.InsideGeometry || type == AntiHackType.InsideTerrain || type == AntiHackType.Ticks)\n\t\t{\n\t\t\tply.lastMovementViolationTime = UnityEngine.Time.realtimeSinceStartup;\n\t\t}\n\t\tif ((ConVar.AntiHack.debuglevel < 2 || !(amount > 0f)) && (ConVar.AntiHack.debuglevel < 3 || type == AntiHackType.NoClip) && ConVar.AntiHack.debuglevel < 4)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tstring text = \"Added violation of \" + amount + \" in frame \" + UnityEngine.Time.frameCount + \" (now has \" + ply.violationLevel + \")\";\n\t\tif (gameObject != null)\n\t\t{\n\t\t\ttext = text + \" \" + gameObject.name;\n\t\t\tBaseEntity baseEntity = UnityEngine.GameObjectEx.ToBaseEntity(gameObject);\n\t\t\tif (baseEntity != null)\n\t\t\t{\n\t\t\t\ttext = text + \" (entity: \" + baseEntity.ShortPrefabName + \")\";\n\t\t\t}\n\t\t}\n\t\tLogToConsole(ply, type, text);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "AntiHack",
      "MethodName": "AddViolation",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2666186024,
      "Name": "CanUseMailbox",
      "FullName": "CanUseMailbox",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "mailbox",
          "typeName": "Mailbox",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use mailbox.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool PlayerIsOwner(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseMailbox\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn player.CanBuild();\n}\n",
      "ParametersText": "BasePlayer player, Mailbox mailbox",
      "TargetName": "Mailbox",
      "MethodName": "PlayerIsOwner",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3041522873,
      "Name": "OnSpinWheel",
      "FullName": "OnSpinWheel",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "spinnerWheel",
          "typeName": "SpinnerWheel",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when spin wheel occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void RPC_Spin(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && AllowPlayerSpins() && (AnyoneSpin() || rpc.player.CanBuild()) && Oxide.Core.Interface.CallHook(\"OnSpinWheel\", rpc.player, this) == null && !(velocity > 15f))\n\t{\n\t\tvelocity += UnityEngine.Random.Range(4f, 7f);\n\t\tToggleChildEntityColliders(state: false);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, SpinnerWheel spinnerWheel",
      "TargetName": "SpinnerWheel",
      "MethodName": "RPC_Spin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1065566406,
      "Name": "CanBeTargeted",
      "FullName": "CanBeTargeted [GunTrap]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local7",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "gunTrap",
          "typeName": "GunTrap",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CheckTrigger()\n{\n\tSystem.Collections.Generic.List<UnityEngine.RaycastHit> obj = null;\n\ttry\n\t{\n\t\tSystem.Collections.Generic.HashSet<BaseEntity> entityContents = trigger.entityContents;\n\t\tif (entityContents == null || entityContents.Count == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanFire())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tIPrivilege privilege = null;\n\t\tforeach (BaseEntity item in entityContents)\n\t\t{\n\t\t\tBasePlayer basePlayer = item as BasePlayer;\n\t\t\tif (basePlayer == null || basePlayer.IsSleeping() || !basePlayer.IsAlive())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", basePlayer, this);\n\t\t\tif (obj2 is bool)\n\t\t\t{\n\t\t\t\tflag = (bool)obj2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!flag2)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t\tprivilege = GetCachedPrivilege();\n\t\t\t}\n\t\t\tif (privilege != null && privilege.IsAuthed(basePlayer))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (obj == null)\n\t\t\t{\n\t\t\t\tobj = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.RaycastHit>>();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tobj.Clear();\n\t\t\t}\n\t\t\tGamePhysics.TraceAll(new UnityEngine.Ray(basePlayer.eyes.position, (GetEyePosition() - basePlayer.eyes.position).normalized), 0f, obj, 9f, 1218519297);\n\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t{\n\t\t\t\tBaseEntity entity = RaycastHitEx.GetEntity(obj[i]);\n\t\t\t\tif (entity != null && (entity == this || entity.EqualNetID(this)))\n\t\t\t\t{\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!(entity != null) || entity.ShouldBlockProjectiles())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn flag;\n\t}\n\tfinally\n\t{\n\t\tif (obj != null)\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer local7, GunTrap gunTrap",
      "TargetName": "GunTrap",
      "MethodName": "CheckTrigger",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1065566406,
      "Name": "CanBeTargeted",
      "FullName": "CanBeTargeted [GunTrap] [patch]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CheckTrigger()\n{\n\tSystem.Collections.Generic.List<UnityEngine.RaycastHit> obj = null;\n\ttry\n\t{\n\t\tSystem.Collections.Generic.HashSet<BaseEntity> entityContents = trigger.entityContents;\n\t\tif (entityContents == null || entityContents.Count == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanFire())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tIPrivilege privilege = null;\n\t\tforeach (BaseEntity item in entityContents)\n\t\t{\n\t\t\tBasePlayer basePlayer = item as BasePlayer;\n\t\t\tif (basePlayer == null || basePlayer.IsSleeping() || !basePlayer.IsAlive())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", basePlayer, this);\n\t\t\tif (obj2 is bool)\n\t\t\t{\n\t\t\t\tflag = (bool)obj2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!flag2)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t\tprivilege = GetCachedPrivilege();\n\t\t\t}\n\t\t\tif (privilege != null && privilege.IsAuthed(basePlayer))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (obj == null)\n\t\t\t{\n\t\t\t\tobj = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.RaycastHit>>();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tobj.Clear();\n\t\t\t}\n\t\t\tGamePhysics.TraceAll(new UnityEngine.Ray(basePlayer.eyes.position, (GetEyePosition() - basePlayer.eyes.position).normalized), 0f, obj, 9f, 1218519297);\n\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t{\n\t\t\t\tBaseEntity entity = RaycastHitEx.GetEntity(obj[i]);\n\t\t\t\tif (entity != null && (entity == this || entity.EqualNetID(this)))\n\t\t\t\t{\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!(entity != null) || entity.ShouldBlockProjectiles())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn flag;\n\t}\n\tfinally\n\t{\n\t\tif (obj != null)\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "GunTrap",
      "MethodName": "CheckTrigger",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1065566406,
      "Name": "CanBeTargeted",
      "FullName": "CanBeTargeted [GunTrap] [patch2]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CheckTrigger()\n{\n\tSystem.Collections.Generic.List<UnityEngine.RaycastHit> obj = null;\n\ttry\n\t{\n\t\tSystem.Collections.Generic.HashSet<BaseEntity> entityContents = trigger.entityContents;\n\t\tif (entityContents == null || entityContents.Count == 0)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanFire())\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = false;\n\t\tbool flag2 = false;\n\t\tIPrivilege privilege = null;\n\t\tforeach (BaseEntity item in entityContents)\n\t\t{\n\t\t\tBasePlayer basePlayer = item as BasePlayer;\n\t\t\tif (basePlayer == null || basePlayer.IsSleeping() || !basePlayer.IsAlive())\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"CanBeTargeted\", basePlayer, this);\n\t\t\tif (obj2 is bool)\n\t\t\t{\n\t\t\t\tflag = (bool)obj2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (!flag2)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t\tprivilege = GetCachedPrivilege();\n\t\t\t}\n\t\t\tif (privilege != null && privilege.IsAuthed(basePlayer))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (obj == null)\n\t\t\t{\n\t\t\t\tobj = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.RaycastHit>>();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tobj.Clear();\n\t\t\t}\n\t\t\tGamePhysics.TraceAll(new UnityEngine.Ray(basePlayer.eyes.position, (GetEyePosition() - basePlayer.eyes.position).normalized), 0f, obj, 9f, 1218519297);\n\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t{\n\t\t\t\tBaseEntity entity = RaycastHitEx.GetEntity(obj[i]);\n\t\t\t\tif (entity != null && (entity == this || entity.EqualNetID(this)))\n\t\t\t\t{\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!(entity != null) || entity.ShouldBlockProjectiles())\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn flag;\n\t}\n\tfinally\n\t{\n\t\tif (obj != null)\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "GunTrap",
      "MethodName": "CheckTrigger",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2595490294,
      "Name": "CanPickupLock",
      "FullName": "CanPickupLock",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseLock",
          "typeName": "BaseLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to pickup lock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\npublic void RPC_TakeLock(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && CanRemove && Oxide.Core.Interface.CallHook(\"CanPickupLock\", rpc.player, this) == null && !IsLocked())\n\t{\n\t\tItem item = ItemManager.Create(itemType, 1, skinID);\n\t\tif (item != null)\n\t\t{\n\t\t\trpc.player.GiveItem(item);\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnEntityPickedUp(rpc.player, this);\n\t\tBaseEntity baseEntity = GetParentEntity();\n\t\tif (baseEntity != null && baseEntity.GetSlot(BaseEntity.Slot.Lock) == this)\n\t\t{\n\t\t\tbaseEntity.SetSlot(BaseEntity.Slot.Lock, null);\n\t\t}\n\t\tKill();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BaseLock baseLock",
      "TargetName": "BaseLock",
      "MethodName": "RPC_TakeLock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1801686644,
      "Name": "CanDismountEntity",
      "FullName": "CanDismountEntity",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DismountPlayer(BasePlayer player, bool lite = false)\n{\n\tif (_mounted == null || _mounted != player || Oxide.Core.Interface.CallHook(\"CanDismountEntity\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (!ShouldRepositionPerFrame())\n\t{\n\t\t_mounted.SetParent(null, worldPositionStays: true, sendImmediate: true);\n\t}\n\tBaseVehicle baseVehicle = VehicleParent();\n\tif (lite)\n\t{\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t\t}\n\t\t_mounted.DismountObject();\n\t\t_mounted = null;\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PlayerDismounted(player, this);\n\t\t}\n\t\tOnPlayerDismounted(player);\n\t\tOxide.Core.Interface.CallHook(\"OnEntityDismounted\", this, player);\n\t\treturn;\n\t}\n\tif (!GetDismountPosition(player, out var res) || Distance(res) > 10f)\n\t{\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t\t}\n\t\tres = player.transform.position;\n\t\t_mounted.DismountObject();\n\t\t_mounted.MovePosition(res);\n\t\t_mounted.transform.rotation = UnityEngine.Quaternion.identity;\n\t\t_mounted.ClientRPC(RpcTarget.Player(\"ForcePositionTo\", _mounted), res);\n\t\tBasePlayer mounted = _mounted;\n\t\t_mounted = null;\n\t\tUnityEngine.Debug.LogWarning(\"Killing player due to invalid dismount point :\" + player.displayName + \" / \" + player.userID.Get() + \" on obj : \" + base.gameObject.name);\n\t\tmounted.Hurt(1000f, Rust.DamageType.Suicide, mounted, useProtection: false);\n\t\tif (baseVehicle != null)\n\t\t{\n\t\t\tbaseVehicle.PlayerDismounted(player, this);\n\t\t}\n\t\tOnPlayerDismounted(player);\n\t\treturn;\n\t}\n\tif (baseVehicle != null)\n\t{\n\t\tbaseVehicle.PrePlayerDismount(player, this);\n\t}\n\tif (AntiHack.TestNoClipping(_mounted, res, res, BasePlayer.NoClipRadius(ConVar.AntiHack.noclip_margin), ConVar.AntiHack.noclip_backtracking, out var _, overlapVehicleLayer: true))\n\t{\n\t\t_mounted.PauseVehicleNoClipDetection(5f);\n\t}\n\t_mounted.DismountObject();\n\t_mounted.transform.rotation = UnityEngine.Quaternion.LookRotation(UnityEngine.Vector3.forward, UnityEngine.Vector3.up);\n\t_mounted.OverrideViewAngles(UnityEngine.Vector3.zero);\n\t_mounted.MovePosition(res);\n\t_mounted.ForceUpdateTriggers();\n\t_mounted.SendNetworkUpdateImmediate();\n\t_mounted.SendModelState(force: true);\n\t_mounted = null;\n\tif (baseVehicle != null)\n\t{\n\t\tbaseVehicle.PlayerDismounted(player, this);\n\t}\n\tif (player.net != null)\n\t{\n\t\tif ((bool)player.GetParentEntity())\n\t\t{\n\t\t\tBaseEntity baseEntity = player.GetParentEntity();\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"ForcePositionToParentOffset\", player), baseEntity.transform.InverseTransformPoint(res), baseEntity.net.ID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"ForcePositionTo\", player), res);\n\t\t\tplayer.ClientRPC(RpcTarget.NetworkGroup(\"ForceResetRotation\", player));\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnDismountEntity(player, this, baseVehicle);\n\tOxide.Core.Interface.CallHook(\"OnEntityDismounted\", this, player);\n\tOnPlayerDismounted(player);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "DismountPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1731456645,
      "Name": "CanMountEntity",
      "FullName": "CanMountEntity",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void MountPlayer(BasePlayer player)\n{\n\tif (_mounted != null || mountAnchor == null || Oxide.Core.Interface.CallHook(\"CanMountEntity\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tplayer.EnsureDismounted();\n\t_mounted = player;\n\tUnityEngine.Transform transform = mountAnchor;\n\tplayer.SetMounted(this);\n\tif (!ShouldRepositionPerFrame())\n\t{\n\t\tif (player.GetParentEntity() != this)\n\t\t{\n\t\t\tplayer.SetParent(this, worldPositionStays: true, sendImmediate: true);\n\t\t}\n\t\tplayer.transform.localPosition = UnityEngine.Vector3.zero;\n\t\tplayer.transform.localRotation = UnityEngine.Quaternion.identity;\n\t\tplayer.transform.hasChanged = true;\n\t}\n\telse\n\t{\n\t\tplayer.MovePosition(transform.position);\n\t\tplayer.transform.rotation = transform.rotation;\n\t\tplayer.ServerRotation = transform.rotation;\n\t}\n\tplayer.OverrideViewAngles(transform.rotation.eulerAngles);\n\t_mounted.eyes.NetworkUpdate(transform.rotation);\n\tplayer.SendNetworkUpdateImmediate();\n\tFacepunch.Rust.Analytics.Azure.OnMountEntity(player, this, VehicleParent());\n\tOnPlayerMounted();\n\tOxide.Core.Interface.CallHook(\"OnEntityMounted\", this, player);\n\tif (allowedGestures == BaseMountable.MountGestureType.None && player.InGesture)\n\t{\n\t\tplayer.Server_CancelGesture();\n\t}\n\telse if (allowedGestures == BaseMountable.MountGestureType.UpperBody && player.InGesture && player.CurrentGestureIsFullBody)\n\t{\n\t\tplayer.Server_CancelGesture();\n\t}\n\tif (this.IsValid() && player.IsValid())\n\t{\n\t\tplayer.ProcessMissionEvent(BaseMission.MissionEventType.MOUNT_ENTITY, net.ID, 1f);\n\t}\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "MountPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 715700557,
      "Name": "OnEntityMounted",
      "FullName": "OnEntityMounted",
      "Category": "Player",
      "Parameters": [
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void MountPlayer(BasePlayer player)\n{\n\tif (_mounted != null || mountAnchor == null || Oxide.Core.Interface.CallHook(\"CanMountEntity\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tplayer.EnsureDismounted();\n\t_mounted = player;\n\tUnityEngine.Transform transform = mountAnchor;\n\tplayer.SetMounted(this);\n\tif (!ShouldRepositionPerFrame())\n\t{\n\t\tif (player.GetParentEntity() != this)\n\t\t{\n\t\t\tplayer.SetParent(this, worldPositionStays: true, sendImmediate: true);\n\t\t}\n\t\tplayer.transform.localPosition = UnityEngine.Vector3.zero;\n\t\tplayer.transform.localRotation = UnityEngine.Quaternion.identity;\n\t\tplayer.transform.hasChanged = true;\n\t}\n\telse\n\t{\n\t\tplayer.MovePosition(transform.position);\n\t\tplayer.transform.rotation = transform.rotation;\n\t\tplayer.ServerRotation = transform.rotation;\n\t}\n\tplayer.OverrideViewAngles(transform.rotation.eulerAngles);\n\t_mounted.eyes.NetworkUpdate(transform.rotation);\n\tplayer.SendNetworkUpdateImmediate();\n\tFacepunch.Rust.Analytics.Azure.OnMountEntity(player, this, VehicleParent());\n\tOnPlayerMounted();\n\tOxide.Core.Interface.CallHook(\"OnEntityMounted\", this, player);\n\tif (allowedGestures == BaseMountable.MountGestureType.None && player.InGesture)\n\t{\n\t\tplayer.Server_CancelGesture();\n\t}\n\telse if (allowedGestures == BaseMountable.MountGestureType.UpperBody && player.InGesture && player.CurrentGestureIsFullBody)\n\t{\n\t\tplayer.Server_CancelGesture();\n\t}\n\tif (this.IsValid() && player.IsValid())\n\t{\n\t\tplayer.ProcessMissionEvent(BaseMission.MissionEventType.MOUNT_ENTITY, net.ID, 1f);\n\t}\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "MountPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2847223575,
      "Name": "OnPlayerWantsDismount",
      "FullName": "OnPlayerWantsDismount",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void RPC_WantsDismount(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!HasValidDismountPosition(player))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerDismountFailed\", player, this);\n\t}\n\telse if (Oxide.Core.Interface.CallHook(\"OnPlayerWantsDismount\", player, this) == null && (!(player != null) || !player.IsRestrained))\n\t{\n\t\tAttemptDismount(player);\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "RPC_WantsDismount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3836587026,
      "Name": "OnPlayerWantsMount",
      "FullName": "OnPlayerWantsMount",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an admin repair action fixes nearby vehicles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void WantsMount(BasePlayer player)\n{\n\tif (!player.IsValid() || !player.CanInteract() || Oxide.Core.Interface.CallHook(\"OnPlayerWantsMount\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (!DirectlyMountable())\n\t{\n\t\tBaseVehicle baseVehicle = VehicleParent();\n\t\tif (baseVehicle != null && baseVehicle.IsVehicleMountPoint(this))\n\t\t{\n\t\t\tbaseVehicle.WantsMount(player);\n\t\t\treturn;\n\t\t}\n\t}\n\tAttemptMount(player);\n}\n",
      "ParametersText": "BasePlayer player, BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "WantsMount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4075313892,
      "Name": "CanSwapToSeat",
      "FullName": "CanSwapToSeat [BaseMountable]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to swap to seat.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanSwapToThis(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanSwapToSeat\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "CanSwapToThis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1686891064,
      "Name": "OnPlayerDismountFailed",
      "FullName": "OnPlayerDismountFailed",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseMountable",
          "typeName": "BaseMountable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void RPC_WantsDismount(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!HasValidDismountPosition(player))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerDismountFailed\", player, this);\n\t}\n\telse if (Oxide.Core.Interface.CallHook(\"OnPlayerWantsDismount\", player, this) == null && (!(player != null) || !player.IsRestrained))\n\t{\n\t\tAttemptDismount(player);\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, BaseMountable baseMountable",
      "TargetName": "BaseMountable",
      "MethodName": "RPC_WantsDismount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3294304457,
      "Name": "OnPlayerActiveShieldDrop",
      "FullName": "OnPlayerActiveShieldDrop",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerBelt",
          "typeName": "PlayerBelt",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Shield",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player active shield is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DropActive(UnityEngine.Vector3 position, UnityEngine.Vector3 velocity)\n{\n\tif (player.TryGetActiveShield(out var foundShield))\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerActiveShieldDrop\", player, foundShield) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tDroppedItem droppedItem = foundShield.GetItem().Drop(position, velocity) as DroppedItem;\n\t\tif (droppedItem != null)\n\t\t{\n\t\t\tdroppedItem.DropReason = DroppedItem.DropReasonEnum.Death;\n\t\t\tdroppedItem.DroppedBy = player.userID;\n\t\t\tdroppedItem.DroppedTime = System.DateTime.UtcNow;\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemDropped(player, droppedItem, DroppedItem.DropReasonEnum.Death);\n\t\t}\n\t}\n\tItem activeItem = player.GetActiveItem();\n\tif (activeItem == null || Oxide.Core.Interface.CallHook(\"OnPlayerDropActiveItem\", player, activeItem) != null)\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"PlayerBelt.DropActive\"))\n\t{\n\t\tDroppedItem droppedItem2 = activeItem.Drop(position, velocity) as DroppedItem;\n\t\tif (droppedItem2 != null)\n\t\t{\n\t\t\tdroppedItem2.DropReason = DroppedItem.DropReasonEnum.Death;\n\t\t\tdroppedItem2.DroppedBy = player.userID;\n\t\t\tdroppedItem2.DroppedTime = System.DateTime.UtcNow;\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemDropped(player, droppedItem2, DroppedItem.DropReasonEnum.Death);\n\t\t}\n\t\tplayer.svActiveItemID = default(ItemId);\n\t\tplayer.SendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "PlayerBelt playerBelt, Shield local0",
      "TargetName": "PlayerBelt",
      "MethodName": "DropActive",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2365467844,
      "Name": "OnPlayerDropActiveItem",
      "FullName": "OnPlayerDropActiveItem",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerBelt",
          "typeName": "PlayerBelt",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player drop active item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DropActive(UnityEngine.Vector3 position, UnityEngine.Vector3 velocity)\n{\n\tif (player.TryGetActiveShield(out var foundShield))\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerActiveShieldDrop\", player, foundShield) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tDroppedItem droppedItem = foundShield.GetItem().Drop(position, velocity) as DroppedItem;\n\t\tif (droppedItem != null)\n\t\t{\n\t\t\tdroppedItem.DropReason = DroppedItem.DropReasonEnum.Death;\n\t\t\tdroppedItem.DroppedBy = player.userID;\n\t\t\tdroppedItem.DroppedTime = System.DateTime.UtcNow;\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemDropped(player, droppedItem, DroppedItem.DropReasonEnum.Death);\n\t\t}\n\t}\n\tItem activeItem = player.GetActiveItem();\n\tif (activeItem == null || Oxide.Core.Interface.CallHook(\"OnPlayerDropActiveItem\", player, activeItem) != null)\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"PlayerBelt.DropActive\"))\n\t{\n\t\tDroppedItem droppedItem2 = activeItem.Drop(position, velocity) as DroppedItem;\n\t\tif (droppedItem2 != null)\n\t\t{\n\t\t\tdroppedItem2.DropReason = DroppedItem.DropReasonEnum.Death;\n\t\t\tdroppedItem2.DroppedBy = player.userID;\n\t\t\tdroppedItem2.DroppedTime = System.DateTime.UtcNow;\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemDropped(player, droppedItem2, DroppedItem.DropReasonEnum.Death);\n\t\t}\n\t\tplayer.svActiveItemID = default(ItemId);\n\t\tplayer.SendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "PlayerBelt playerBelt, Item local1",
      "TargetName": "PlayerBelt",
      "MethodName": "DropActive",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [ResourceContainer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "resourceContainer",
          "typeName": "ResourceContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void StartLootingContainer(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif ((bool)player && player.CanInteract() && lootable && Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) == null && player.inventory.loot.StartLootingEntity(base.baseEntity))\n\t{\n\t\tlastAccessTime = UnityEngine.Time.realtimeSinceStartup;\n\t\tplayer.inventory.loot.AddContainer(container);\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, ResourceContainer resourceContainer",
      "TargetName": "ResourceContainer",
      "MethodName": "StartLootingContainer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [DroppedItemContainer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "droppedItemContainer",
          "typeName": "DroppedItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_OpenLoot(BaseEntity.RPCMessage rpc)\n{\n\tif (inventory != null)\n\t{\n\t\tBasePlayer player = rpc.player;\n\t\tif ((bool)player && player.CanInteract() && Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) == null && player.inventory.loot.StartLootingEntity(this))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Open, b: true);\n\t\t\tplayer.inventory.loot.AddContainer(inventory);\n\t\t\tplayer.inventory.loot.SendImmediate();\n\t\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), lootPanelName);\n\t\t\tSendNetworkUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, DroppedItemContainer droppedItemContainer",
      "TargetName": "DroppedItemContainer",
      "MethodName": "RPC_OpenLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3392492984,
      "Name": "OnLootEntityEnd",
      "FullName": "OnLootEntityEnd [DroppedItemContainer]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "droppedItemContainer",
          "typeName": "DroppedItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot entity ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PlayerStoppedLooting(BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnLootEntityEnd\", player, this);\n\tif (inventory == null || inventory.itemList == null || inventory.itemList.Count == 0)\n\t{\n\t\tKill();\n\t}\n\telse\n\t{\n\t\tResetRemovalTime();\n\t\tSetFlag(BaseEntity.Flags.Open, b: false);\n\t\tSendNetworkUpdate();\n\t}\n\tEvaluateBagConditions();\n}\n",
      "ParametersText": "BasePlayer player, DroppedItemContainer droppedItemContainer",
      "TargetName": "DroppedItemContainer",
      "MethodName": "PlayerStoppedLooting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1229062350,
      "Name": "CanHackCrate",
      "FullName": "CanHackCrate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "hackableLockedCrate",
          "typeName": "HackableLockedCrate",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to hack crate.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_Hack(BaseEntity.RPCMessage msg)\n{\n\tif (!IsBeingHacked() && Oxide.Core.Interface.CallHook(\"CanHackCrate\", msg.player, this) == null)\n\t{\n\t\tFacepunch.Rust.Analytics.Azure.OnLockedCrateStarted(msg.player, this);\n\t\toriginalHackerPlayerId = msg.player.userID;\n\t\toriginalHackerPlayer = msg.player;\n\t\tif (!string.IsNullOrEmpty(achievementStartHacking))\n\t\t{\n\t\t\tmsg.player?.GiveAchievement(achievementStartHacking);\n\t\t}\n\t\tStartHacking();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, HackableLockedCrate hackableLockedCrate",
      "TargetName": "HackableLockedCrate",
      "MethodName": "RPC_Hack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4234760546,
      "Name": "OnExperimentStart",
      "FullName": "OnExperimentStart",
      "Category": "Player",
      "Parameters": [
        {
          "name": "workbench",
          "typeName": "Workbench",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an experiment starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_BeginExperiment(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (player == null || IsWorking())\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.PersistantPlayer persistantPlayerInfo = player.PersistantPlayerInfo;\n\tint num = UnityEngine.Random.Range(0, experimentalItems.subSpawn.Length);\n\tfor (int i = 0; i < experimentalItems.subSpawn.Length; i++)\n\t{\n\t\tint num2 = i + num;\n\t\tif (num2 >= experimentalItems.subSpawn.Length)\n\t\t{\n\t\t\tnum2 -= experimentalItems.subSpawn.Length;\n\t\t}\n\t\tItemDefinition itemDef = experimentalItems.subSpawn[num2].category.items[0].itemDef;\n\t\tif ((bool)itemDef.Blueprint && !itemDef.Blueprint.defaultBlueprint && itemDef.Blueprint.userCraftable && itemDef.Blueprint.isResearchable && !itemDef.Blueprint.NeedsSteamItem && !itemDef.Blueprint.NeedsSteamDLC && !persistantPlayerInfo.unlockedItems.Contains(itemDef.itemid))\n\t\t{\n\t\t\tpendingBlueprint = itemDef;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (pendingBlueprint == null)\n\t{\n\t\tplayer.ChatMessage(\"You have already unlocked everything for this workbench tier.\");\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnExperimentStart\", this, player) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tItem slot = base.inventory.GetSlot(0);\n\t\tif (slot != null)\n\t\t{\n\t\t\tif (!slot.MoveToContainer(player.inventory.containerMain))\n\t\t\t{\n\t\t\t\tslot.Drop(GetDropPosition(), GetDropVelocity());\n\t\t\t}\n\t\t\tplayer.inventory.loot.SendImmediate();\n\t\t}\n\t\tif (experimentStartEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(experimentStartEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tbase.inventory.SetLocked(isLocked: true);\n\t\tCancelInvoke(ExperimentComplete);\n\t\tInvoke(ExperimentComplete, 5f);\n\t\tSendNetworkUpdate();\n\t\tOxide.Core.Interface.CallHook(\"OnExperimentStarted\", this, player);\n\t}\n}\n",
      "ParametersText": "Workbench workbench, BasePlayer local0",
      "TargetName": "Workbench",
      "MethodName": "RPC_BeginExperiment",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1442929596,
      "Name": "OnExperimentStarted",
      "FullName": "OnExperimentStarted",
      "Category": "Player",
      "Parameters": [
        {
          "name": "workbench",
          "typeName": "Workbench",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an experiment starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_BeginExperiment(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (player == null || IsWorking())\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.PersistantPlayer persistantPlayerInfo = player.PersistantPlayerInfo;\n\tint num = UnityEngine.Random.Range(0, experimentalItems.subSpawn.Length);\n\tfor (int i = 0; i < experimentalItems.subSpawn.Length; i++)\n\t{\n\t\tint num2 = i + num;\n\t\tif (num2 >= experimentalItems.subSpawn.Length)\n\t\t{\n\t\t\tnum2 -= experimentalItems.subSpawn.Length;\n\t\t}\n\t\tItemDefinition itemDef = experimentalItems.subSpawn[num2].category.items[0].itemDef;\n\t\tif ((bool)itemDef.Blueprint && !itemDef.Blueprint.defaultBlueprint && itemDef.Blueprint.userCraftable && itemDef.Blueprint.isResearchable && !itemDef.Blueprint.NeedsSteamItem && !itemDef.Blueprint.NeedsSteamDLC && !persistantPlayerInfo.unlockedItems.Contains(itemDef.itemid))\n\t\t{\n\t\t\tpendingBlueprint = itemDef;\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (pendingBlueprint == null)\n\t{\n\t\tplayer.ChatMessage(\"You have already unlocked everything for this workbench tier.\");\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnExperimentStart\", this, player) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tItem slot = base.inventory.GetSlot(0);\n\t\tif (slot != null)\n\t\t{\n\t\t\tif (!slot.MoveToContainer(player.inventory.containerMain))\n\t\t\t{\n\t\t\t\tslot.Drop(GetDropPosition(), GetDropVelocity());\n\t\t\t}\n\t\t\tplayer.inventory.loot.SendImmediate();\n\t\t}\n\t\tif (experimentStartEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(experimentStartEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tbase.inventory.SetLocked(isLocked: true);\n\t\tCancelInvoke(ExperimentComplete);\n\t\tInvoke(ExperimentComplete, 5f);\n\t\tSendNetworkUpdate();\n\t\tOxide.Core.Interface.CallHook(\"OnExperimentStarted\", this, player);\n\t}\n}\n",
      "ParametersText": "Workbench workbench, BasePlayer local0",
      "TargetName": "Workbench",
      "MethodName": "RPC_BeginExperiment",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 737761198,
      "Name": "OnExperimentEnd",
      "FullName": "OnExperimentEnd",
      "Category": "Player",
      "Parameters": [
        {
          "name": "workbench",
          "typeName": "Workbench",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an experiment ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ExperimentComplete()\n{\n\tItem experimentResourceItem = GetExperimentResourceItem();\n\tint scrapForExperiment = GetScrapForExperiment();\n\tif (pendingBlueprint == null)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Pending blueprint was null!\");\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnExperimentEnd\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (experimentResourceItem != null && experimentResourceItem.amount >= scrapForExperiment && pendingBlueprint != null)\n\t{\n\t\texperimentResourceItem.UseItem(scrapForExperiment);\n\t\tItem item = ItemManager.Create(GetBlueprintTemplate(), 1, 0uL);\n\t\titem.blueprintTarget = pendingBlueprint.itemid;\n\t\tcreatingBlueprint = true;\n\t\tif (!item.MoveToContainer(base.inventory, 0))\n\t\t{\n\t\t\titem.Drop(GetDropPosition(), GetDropVelocity());\n\t\t}\n\t\tcreatingBlueprint = false;\n\t\tif (experimentSuccessEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(experimentSuccessEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t}\n\tSetFlag(BaseEntity.Flags.On, b: false);\n\tpendingBlueprint = null;\n\tbase.inventory.SetLocked(isLocked: false);\n\tSendNetworkUpdate();\n\tOxide.Core.Interface.CallHook(\"OnExperimentEnded\", this);\n}\n",
      "ParametersText": "Workbench workbench",
      "TargetName": "Workbench",
      "MethodName": "ExperimentComplete",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 864580963,
      "Name": "OnExperimentEnded",
      "FullName": "OnExperimentEnded",
      "Category": "Player",
      "Parameters": [
        {
          "name": "workbench",
          "typeName": "Workbench",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an experiment ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ExperimentComplete()\n{\n\tItem experimentResourceItem = GetExperimentResourceItem();\n\tint scrapForExperiment = GetScrapForExperiment();\n\tif (pendingBlueprint == null)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Pending blueprint was null!\");\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnExperimentEnd\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (experimentResourceItem != null && experimentResourceItem.amount >= scrapForExperiment && pendingBlueprint != null)\n\t{\n\t\texperimentResourceItem.UseItem(scrapForExperiment);\n\t\tItem item = ItemManager.Create(GetBlueprintTemplate(), 1, 0uL);\n\t\titem.blueprintTarget = pendingBlueprint.itemid;\n\t\tcreatingBlueprint = true;\n\t\tif (!item.MoveToContainer(base.inventory, 0))\n\t\t{\n\t\t\titem.Drop(GetDropPosition(), GetDropVelocity());\n\t\t}\n\t\tcreatingBlueprint = false;\n\t\tif (experimentSuccessEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(experimentSuccessEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t}\n\tSetFlag(BaseEntity.Flags.On, b: false);\n\tpendingBlueprint = null;\n\tbase.inventory.SetLocked(isLocked: false);\n\tSendNetworkUpdate();\n\tOxide.Core.Interface.CallHook(\"OnExperimentEnded\", this);\n}\n",
      "ParametersText": "Workbench workbench",
      "TargetName": "Workbench",
      "MethodName": "ExperimentComplete",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1498549656,
      "Name": "CanTakeCutting",
      "FullName": "CanTakeCutting",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "growableEntity",
          "typeName": "GrowableEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to take cutting.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TakeClones(BasePlayer player)\n{\n\tif (player == null || !CanClone(player) || Oxide.Core.Interface.CallHook(\"CanTakeCutting\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tint num = Properties.BaseCloneCount + Genes.GetGeneTypeCount(GrowableGenetics.GeneType.Yield) / 2;\n\tif (num > 0)\n\t{\n\t\tItem item = ItemManager.Create(Properties.CloneItem, num, 0uL);\n\t\titem.SetItemOwnership(player, ItemOwnershipPhrases.Cloned);\n\t\tGrowableGeneEncoding.EncodeGenesToItem(this, item);\n\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, this, player);\n\t\tplayer.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\tif (Properties.pickEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(Properties.pickEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tTellPlanter();\n\t\tDie();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, GrowableEntity growableEntity",
      "TargetName": "GrowableEntity",
      "MethodName": "TakeClones",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4147351781,
      "Name": "OnPayForUpgrade",
      "FullName": "OnPayForUpgrade",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "g",
          "typeName": "ConstructionGrade",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a pay for upgrades."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PayForUpgrade(ConstructionGrade g, BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPayForUpgrade\", player, this, g) != null || (player.IsInCreativeMode && ConVar.Creative.freeBuild))\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<Item> list = new System.Collections.Generic.List<Item>();\n\tforeach (ItemAmount item in g.CostToBuild(grade))\n\t{\n\t\tplayer.inventory.Take(list, item.itemid, (int)item.amount);\n\t\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(item.itemid);\n\t\tFacepunch.Rust.Analytics.Azure.LogResource(Facepunch.Rust.Analytics.Azure.ResourceMode.Consumed, \"upgrade_block\", itemDefinition.shortname, (int)item.amount, this, null, safezone: false, null, player.userID, null, null, null, 0uL);\n\t\tplayer.Command(\"note.inv \" + item.itemid + \" \" + item.amount * -1f);\n\t}\n\tforeach (Item item2 in list)\n\t{\n\t\titem2.Remove();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BuildingBlock buildingBlock, ConstructionGrade g",
      "TargetName": "BuildingBlock",
      "MethodName": "PayForUpgrade",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2856988568,
      "Name": "OnPayForPlacement",
      "FullName": "OnPayForPlacement [Planner]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "planner",
          "typeName": "Planner",
          "optional": false
        },
        {
          "name": "component",
          "typeName": "Construction",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when pay for placement occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void PayForPlacement(BasePlayer player, Construction component)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPayForPlacement\", player, this, component) != null || (player.IsInCreativeMode && ConVar.Creative.freeBuild))\n\t{\n\t\treturn;\n\t}\n\tif (player.IsInTutorial)\n\t{\n\t\tTutorialIsland currentTutorialIsland = player.GetCurrentTutorialIsland();\n\t\tif (currentTutorialIsland != null)\n\t\t{\n\t\t\tcurrentTutorialIsland.OnPlayerBuiltConstruction(player);\n\t\t}\n\t}\n\tif (isTypeDeployable)\n\t{\n\t\tGetItem().UseItem();\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<Item> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Item>>();\n\tforeach (ItemAmount item in component.defaultGrade.CostToBuild())\n\t{\n\t\tplayer.inventory.Take(obj, item.itemDef.itemid, (int)item.amount);\n\t\tplayer.Command(\"note.inv\", item.itemDef.itemid, item.amount * -1f);\n\t\tFacepunch.Rust.Analytics.Azure.LogResource(Facepunch.Rust.Analytics.Azure.ResourceMode.Consumed, \"build_block\", item.itemDef.shortname, (int)item.amount, null, null, safezone: false, null, player.userID, null, null, null, 0uL);\n\t}\n\tforeach (Item item2 in obj)\n\t{\n\t\titem2.Remove();\n\t}\n\tFacepunch.Pool.Free(ref obj, freeElements: false);\n}\n",
      "ParametersText": "BasePlayer player, Planner planner, Construction component",
      "TargetName": "Planner",
      "MethodName": "PayForPlacement",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2856988568,
      "Name": "OnPayForPlacement",
      "FullName": "OnPayForPlacement [WallpaperPlanner]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "wallpaperPlanner",
          "typeName": "WallpaperPlanner",
          "optional": false
        },
        {
          "name": "component",
          "typeName": "Construction",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when pay for placement occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void PayForPlacement(BasePlayer player, Construction component)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPayForPlacement\", player, this, component) == null && (!player.IsInCreativeMode || !ConVar.Creative.freeBuild))\n\t{\n\t\tplayer.inventory.Take(null, placementPrice.itemid, (int)placementPrice.amount);\n\t\tplayer.Command(\"note.inv\", placementPrice.itemid, (int)placementPrice.amount * -1);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, WallpaperPlanner wallpaperPlanner, Construction component",
      "TargetName": "WallpaperPlanner",
      "MethodName": "PayForPlacement",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3354461128,
      "Name": "OnWireConnect",
      "FullName": "OnWireConnect",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "IOEntity",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "local6",
          "typeName": "IOEntity",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "linePoints",
          "typeName": "System.Collections.Generic.List`1[UnityEngine.Vector3]",
          "optional": false
        },
        {
          "name": "local8",
          "typeName": "System.Collections.Generic.List`1[System.Single]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a wire connects."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.WireConnectionMessage) })]\npublic void RPC_MakeConnection(BaseEntity.RPCMessage rpc)\n{\n\tBasePlayer player = rpc.player;\n\tif (!CanPlayerUseWires(player))\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.WireConnectionMessage wireConnectionMessage = rpc.read.Proto<ProtoBuf.WireConnectionMessage>();\n\tSystem.Collections.Generic.List<UnityEngine.Vector3> linePoints = wireConnectionMessage.linePoints;\n\tint inputIndex = wireConnectionMessage.inputIndex;\n\tint outputIndex = wireConnectionMessage.outputIndex;\n\tIOEntity iOEntity = new EntityRef<IOEntity>(wireConnectionMessage.inputID).Get(serverside: true);\n\tIOEntity iOEntity2 = new EntityRef<IOEntity>(wireConnectionMessage.outputID).Get(serverside: true);\n\tif (iOEntity == null || iOEntity2 == null || !SharesRootParent(iOEntity, iOEntity2) || !ValidateLine(linePoints, iOEntity, iOEntity2, player, outputIndex) || inputIndex >= iOEntity.inputs.Length || outputIndex >= iOEntity2.outputs.Length || iOEntity.inputs[inputIndex].connectedTo.Get() != null || iOEntity2.outputs[outputIndex].connectedTo.Get() != null || (iOEntity.inputs[inputIndex].rootConnectionsOnly && !iOEntity2.IsRootEntity()) || !CanModifyEntity(player, iOEntity) || !CanModifyEntity(player, iOEntity2))\n\t{\n\t\treturn;\n\t}\n\tNetworkableId obj = (validatedWireIsInput ? wireConnectionMessage.inputID : wireConnectionMessage.outputID);\n\tint num = (validatedWireIsInput ? inputIndex : outputIndex);\n\tif (obj != validatedWireEntity || num != validatedWireSlot)\n\t{\n\t\treturn;\n\t}\n\tvalidatedWireEntity = default(NetworkableId);\n\tvalidatedWireSlot = -1;\n\tSystem.Collections.Generic.List<float> slackLevels = wireConnectionMessage.slackLevels;\n\tif (slackLevels.Count != linePoints.Count)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i < slackLevels.Count; i++)\n\t{\n\t\tif (slackLevels[i] < 0f || slackLevels[i] > 2f)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\tIOEntity.LineAnchor[] array = new IOEntity.LineAnchor[wireConnectionMessage.lineAnchors.Count];\n\tif (!ValidateLineAnchors(iOEntity, wireConnectionMessage.lineAnchors, array, linePoints, player))\n\t{\n\t\treturn;\n\t}\n\tWireTool.WireColour wireColour = IntToColour(wireConnectionMessage.wireColor);\n\tif (Oxide.Core.Interface.CallHook(\"OnWireConnect\", player, iOEntity, inputIndex, iOEntity2, outputIndex, wireConnectionMessage.linePoints, slackLevels) == null)\n\t{\n\t\tif (wireColour == WireTool.WireColour.Invisible && !player.IsInCreativeMode)\n\t\t{\n\t\t\twireColour = DefaultColor;\n\t\t}\n\t\tiOEntity2.ConnectTo(iOEntity, outputIndex, inputIndex, linePoints, slackLevels, array, wireColour);\n\t\tif (wireType == IOEntity.IOType.Industrial)\n\t\t{\n\t\t\tiOEntity.NotifyIndustrialNetworkChanged();\n\t\t\tiOEntity2.NotifyIndustrialNetworkChanged();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, IOEntity local5, int local3, IOEntity local6, int local4, System.Collections.Generic.List`1[UnityEngine.Vector3] linePoints, System.Collections.Generic.List`1[System.Single] local8",
      "TargetName": "WireTool",
      "MethodName": "RPC_MakeConnection",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2532588357,
      "Name": "CanUseWires",
      "FullName": "CanUseWires",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use wires.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool CanPlayerUseWires(BasePlayer player, bool cached = false, float cacheDuration = 1f)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseWires\", player, cached, cacheDuration);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player != null && player.IsInCreativeMode && ConVar.Creative.unlimitedIo)\n\t{\n\t\treturn true;\n\t}\n\tWireTool wireTool = player.GetHeldEntity() as WireTool;\n\tif (wireTool == null)\n\t{\n\t\treturn false;\n\t}\n\tif (!wireTool.CanBeUsedInWater() && player.IsSwimming())\n\t{\n\t\treturn false;\n\t}\n\tif (!player.CanBuild(cached, cacheDuration))\n\t{\n\t\treturn false;\n\t}\n\tSystem.Collections.Generic.List<UnityEngine.Collider> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<UnityEngine.Collider>>();\n\tGamePhysics.OverlapSphere(player.eyes.position, 0.1f, obj2, 536870912, UnityEngine.QueryTriggerInteraction.Collide);\n\tbool result = true;\n\tforeach (UnityEngine.Collider item in obj2)\n\t{\n\t\tif (!item.gameObject.CompareTag(\"IgnoreWireCheck\"))\n\t\t{\n\t\t\tresult = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\treturn result;\n}\n",
      "ParametersText": "",
      "TargetName": "WireTool",
      "MethodName": "CanPlayerUseWires",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 4134094306,
      "Name": "OnPlayerStudyBlueprint",
      "FullName": "OnPlayerStudyBlueprint",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player study blueprint occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ServerCommand(Item item, string command, BasePlayer player)\n{\n\tif (command != \"study\" || !item.IsBlueprint())\n\t{\n\t\treturn;\n\t}\n\tif (item.GetOwnerPlayer() != player && player.inventory.GetBackpackWithInventory()?.contents != item.parent)\n\t{\n\t\tbool flag = false;\n\t\tforeach (ItemContainer container in player.inventory.loot.containers)\n\t\t{\n\t\t\tif (item.GetRootContainer() == container)\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\tif (IsBlueprintUnlocked(item, player, out var blueprintTargetDef, out var blueprint) || Oxide.Core.Interface.CallHook(\"OnPlayerStudyBlueprint\", player, item) != null)\n\t{\n\t\treturn;\n\t}\n\tItem item2 = item;\n\tif (item.amount > 1)\n\t{\n\t\titem2 = item.SplitItem(1);\n\t}\n\titem2.UseItem();\n\tplayer.blueprints.Unlock(blueprintTargetDef);\n\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, blueprintTargetDef, \"blueprint\", ResearchTable.ScrapForResearch(blueprintTargetDef), player);\n\tif (blueprint != null && blueprint.additionalUnlocks != null && blueprint.additionalUnlocks.Count > 0)\n\t{\n\t\tforeach (ItemDefinition additionalUnlock in blueprint.additionalUnlocks)\n\t\t{\n\t\t\tplayer.blueprints.Unlock(additionalUnlock);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, additionalUnlock, \"blueprint\", 0, player);\n\t\t}\n\t}\n\tif (studyEffect.isValid)\n\t{\n\t\tEffect.server.Run(studyEffect.resourcePath, player, StringPool.Get(\"head\"), UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, Item item",
      "TargetName": "ItemModStudyBlueprint",
      "MethodName": "ServerCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [RidableHorse]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "ridableHorse",
          "typeName": "RidableHorse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void SERVER_OpenLoot(BaseEntity.RPCMessage rpc)\n{\n\tif (storageInventory == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = rpc.player;\n\tstring text = rpc.read.String();\n\tif (!(player == null) && player.CanInteract() && CanOpenStorage(player) && (!needsBuildingPrivilegeToUse || player.CanBuild()) && Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) == null && player.inventory.loot.StartLootingEntity(this))\n\t{\n\t\tItemContainer container = equipmentInventory;\n\t\tstring arg = lootPanelName;\n\t\tif (text == \"storage\")\n\t\t{\n\t\t\targ = storagePanelName;\n\t\t\tcontainer = storageInventory;\n\t\t}\n\t\tplayer.inventory.loot.AddContainer(container);\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), arg);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, RidableHorse ridableHorse",
      "TargetName": "RidableHorse",
      "MethodName": "SERVER_OpenLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2060069440,
      "Name": "OnClothingItemChanged",
      "FullName": "OnClothingItemChanged",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "bAdded",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a clothing item is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnClothingChanged(Item item, bool bAdded)\n{\n\tbase.baseEntity.SV_ClothingChanged();\n\tif (ItemManager.EnablePooling)\n\t{\n\t\tif (!IsInvoking(DeferredServerUpdateAction))\n\t\t{\n\t\t\tInvoke(DeferredServerUpdateAction, 0f);\n\t\t}\n\t}\n\telse\n\t{\n\t\tItemManager.DoRemoves();\n\t\tServerUpdate(0f);\n\t}\n\tif (item.position == 7)\n\t{\n\t\titem.RecalulateParentEntity(children: true);\n\t\tInvoke(UpdatedVisibleHolsteredItems, 0.1f);\n\t\tif (base.baseEntity.GetHeldEntity() != null)\n\t\t{\n\t\t\tbase.baseEntity.GetHeldEntity().UpdateShieldState(bHeld: true);\n\t\t}\n\t\titem?.contents?.onItemAddedRemoved?.Invoke(item, bAdded);\n\t}\n\tbase.baseEntity.ProcessMissionEvent(BaseMission.MissionEventType.CLOTHINGCHANGED, 0, 0f);\n\tOxide.Core.Interface.CallHook(\"OnClothingItemChanged\", this, item, bAdded);\n}\n",
      "ParametersText": "PlayerInventory playerInventory, Item item, bool bAdded",
      "TargetName": "PlayerInventory",
      "MethodName": "OnClothingChanged",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3443870137,
      "Name": "OnDefaultItemsReceive",
      "FullName": "OnDefaultItemsReceive",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when default items receive occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void GiveDefaultItems()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnDefaultItemsReceive\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tStrip();\n\tBaseGameMode activeGameMode = BaseGameMode.GetActiveGameMode(serverside: true);\n\tif (activeGameMode != null && activeGameMode.HasLoadouts())\n\t{\n\t\tBaseGameMode.GetActiveGameMode(serverside: true).LoadoutPlayer(base.baseEntity);\n\t\treturn;\n\t}\n\tGiveDefaultItemWithSkin(\"client.rockskin\", \"rock\");\n\tGiveDefaultItemWithSkin(\"client.torchskin\", \"torch\");\n\tif (IsBirthday() && !base.baseEntity.IsInTutorial)\n\t{\n\t\tTryGiveItem(\"cakefiveyear\", 0uL, containerBelt);\n\t\tTryGiveItem(\"partyhat\", 0uL, containerWear);\n\t}\n\tif (IsChristmas() && !base.baseEntity.IsInTutorial)\n\t{\n\t\tTryGiveItem(\"snowball\", 0uL, containerBelt);\n\t\tTryGiveItem(\"snowball\", 0uL, containerBelt);\n\t\tTryGiveItem(\"snowball\", 0uL, containerBelt);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnDefaultItemsReceived\", this);\n\tvoid GiveDefaultItemWithSkin(string convarSkinName, string itemShortName)\n\t{\n\t\tulong num = 0uL;\n\t\tint infoInt = base.baseEntity.GetInfoInt(convarSkinName, 0);\n\t\tbool flag = false;\n\t\tif (infoInt > 0 && base.baseEntity.blueprints.CheckSkinOwnership(infoInt, base.baseEntity))\n\t\t{\n\t\t\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(itemShortName);\n\t\t\tif (itemDefinition != null && ItemDefinition.FindSkin(itemDefinition.itemid, infoInt) != 0L)\n\t\t\t{\n\t\t\t\tIPlayerItemDefinition itemDefinition2 = PlatformService.Instance.GetItemDefinition(infoInt);\n\t\t\t\tif (itemDefinition2 != null)\n\t\t\t\t{\n\t\t\t\t\tnum = itemDefinition2.WorkshopDownload;\n\t\t\t\t}\n\t\t\t\tif (num == 0L && itemDefinition.skins != null)\n\t\t\t\t{\n\t\t\t\t\tItemSkinDirectory.Skin[] skins = itemDefinition.skins;\n\t\t\t\t\tfor (int i = 0; i < skins.Length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tItemSkinDirectory.Skin skin2 = skins[i];\n\t\t\t\t\t\tif (skin2.id == infoInt && skin2.invItem != null && skin2.invItem is ItemSkin itemSkin && itemSkin.Redirect != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTryGiveItem(itemSkin.Redirect.shortname, 0uL, containerBelt);\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tTryGiveItem(itemShortName, num, containerBelt);\n\t\t}\n\t}\n\tbool TryGiveItem(string itemShortName, ulong skin, ItemContainer container)\n\t{\n\t\tItem item = ItemManager.CreateByName(itemShortName, 1, skin);\n\t\tif (item != null)\n\t\t{\n\t\t\titem.SetItemOwnership(base.baseEntity, ItemOwnershipPhrases.BornPhrase);\n\t\t\tGiveItem(item, container);\n\t\t\treturn true;\n\t\t}\n\t\tUnityEngine.Debug.LogError($\"Failed to spawn {itemShortName} with {skin}!\");\n\t\treturn false;\n\t}\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "GiveDefaultItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3137645909,
      "Name": "OnDefaultItemsReceived",
      "FullName": "OnDefaultItemsReceived",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a default items is received."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void GiveDefaultItems()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnDefaultItemsReceive\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tStrip();\n\tBaseGameMode activeGameMode = BaseGameMode.GetActiveGameMode(serverside: true);\n\tif (activeGameMode != null && activeGameMode.HasLoadouts())\n\t{\n\t\tBaseGameMode.GetActiveGameMode(serverside: true).LoadoutPlayer(base.baseEntity);\n\t\treturn;\n\t}\n\tGiveDefaultItemWithSkin(\"client.rockskin\", \"rock\");\n\tGiveDefaultItemWithSkin(\"client.torchskin\", \"torch\");\n\tif (IsBirthday() && !base.baseEntity.IsInTutorial)\n\t{\n\t\tTryGiveItem(\"cakefiveyear\", 0uL, containerBelt);\n\t\tTryGiveItem(\"partyhat\", 0uL, containerWear);\n\t}\n\tif (IsChristmas() && !base.baseEntity.IsInTutorial)\n\t{\n\t\tTryGiveItem(\"snowball\", 0uL, containerBelt);\n\t\tTryGiveItem(\"snowball\", 0uL, containerBelt);\n\t\tTryGiveItem(\"snowball\", 0uL, containerBelt);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnDefaultItemsReceived\", this);\n\tvoid GiveDefaultItemWithSkin(string convarSkinName, string itemShortName)\n\t{\n\t\tulong num = 0uL;\n\t\tint infoInt = base.baseEntity.GetInfoInt(convarSkinName, 0);\n\t\tbool flag = false;\n\t\tif (infoInt > 0 && base.baseEntity.blueprints.CheckSkinOwnership(infoInt, base.baseEntity))\n\t\t{\n\t\t\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(itemShortName);\n\t\t\tif (itemDefinition != null && ItemDefinition.FindSkin(itemDefinition.itemid, infoInt) != 0L)\n\t\t\t{\n\t\t\t\tIPlayerItemDefinition itemDefinition2 = PlatformService.Instance.GetItemDefinition(infoInt);\n\t\t\t\tif (itemDefinition2 != null)\n\t\t\t\t{\n\t\t\t\t\tnum = itemDefinition2.WorkshopDownload;\n\t\t\t\t}\n\t\t\t\tif (num == 0L && itemDefinition.skins != null)\n\t\t\t\t{\n\t\t\t\t\tItemSkinDirectory.Skin[] skins = itemDefinition.skins;\n\t\t\t\t\tfor (int i = 0; i < skins.Length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tItemSkinDirectory.Skin skin2 = skins[i];\n\t\t\t\t\t\tif (skin2.id == infoInt && skin2.invItem != null && skin2.invItem is ItemSkin itemSkin && itemSkin.Redirect != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTryGiveItem(itemSkin.Redirect.shortname, 0uL, containerBelt);\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tTryGiveItem(itemShortName, num, containerBelt);\n\t\t}\n\t}\n\tbool TryGiveItem(string itemShortName, ulong skin, ItemContainer container)\n\t{\n\t\tItem item = ItemManager.CreateByName(itemShortName, 1, skin);\n\t\tif (item != null)\n\t\t{\n\t\t\titem.SetItemOwnership(base.baseEntity, ItemOwnershipPhrases.BornPhrase);\n\t\t\tGiveItem(item, container);\n\t\t\treturn true;\n\t\t}\n\t\tUnityEngine.Debug.LogError($\"Failed to spawn {itemShortName} with {skin}!\");\n\t\treturn false;\n\t}\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "GiveDefaultItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2916584000,
      "Name": "OnInventoryNetworkUpdate",
      "FullName": "OnInventoryNetworkUpdate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        },
        {
          "name": "container",
          "typeName": "ItemContainer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.UpdateItemContainer",
          "optional": false
        },
        {
          "name": "type",
          "typeName": "PlayerInventory+Type",
          "optional": false
        },
        {
          "name": "mode",
          "typeName": "PlayerInventory+NetworkInventoryMode",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory network is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendUpdatedInventoryInternal(PlayerInventory.Type type, ItemContainer container, PlayerInventory.NetworkInventoryMode mode)\n{\n\tusing ProtoBuf.UpdateItemContainer updateItemContainer = Facepunch.Pool.Get<ProtoBuf.UpdateItemContainer>();\n\tupdateItemContainer.type = (int)type;\n\tif (base.baseEntity.IsSpectating())\n\t{\n\t\tmode = PlayerInventory.NetworkInventoryMode.LocalPlayer;\n\t}\n\tif (container != null)\n\t{\n\t\tcontainer.dirty = false;\n\t\tupdateItemContainer.container = Facepunch.Pool.Get<System.Collections.Generic.List<ProtoBuf.ItemContainer>>();\n\t\tbool bIncludeContainer = type != PlayerInventory.Type.Wear || mode == PlayerInventory.NetworkInventoryMode.LocalPlayer;\n\t\tupdateItemContainer.container.Add(container.Save(bIncludeContainer));\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnInventoryNetworkUpdate\", this, container, updateItemContainer, type, mode) != null)\n\t{\n\t\treturn;\n\t}\n\tswitch (mode)\n\t{\n\tcase PlayerInventory.NetworkInventoryMode.Everyone:\n\t\tbase.baseEntity.ClientRPC(RpcTarget.NetworkGroup(\"UpdatedItemContainer\"), updateItemContainer);\n\t\tbreak;\n\tcase PlayerInventory.NetworkInventoryMode.LocalPlayer:\n\t\tbase.baseEntity.ClientRPC(RpcTarget.Player(\"UpdatedItemContainer\", base.baseEntity), updateItemContainer);\n\t\tbreak;\n\tcase PlayerInventory.NetworkInventoryMode.EveryoneButLocal:\n\t\tif (base.baseEntity.net?.group?.subscribers == null)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\t{\n\t\t\tforeach (Network.Connection subscriber in base.baseEntity.net.group.subscribers)\n\t\t\t{\n\t\t\t\tif (subscriber.player is BasePlayer basePlayer && basePlayer != base.baseEntity)\n\t\t\t\t{\n\t\t\t\t\tbase.baseEntity.ClientRPC(RpcTarget.Player(\"UpdatedItemContainer\", basePlayer), updateItemContainer);\n\t\t\t\t}\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t}\n}\n",
      "ParametersText": "PlayerInventory playerInventory, ItemContainer container, ProtoBuf.UpdateItemContainer local0, PlayerInventory.Type type, PlayerInventory.NetworkInventoryMode mode",
      "TargetName": "PlayerInventory",
      "MethodName": "SendUpdatedInventoryInternal",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1601410662,
      "Name": "CanRagdollDismount",
      "FullName": "CanRagdollDismount",
      "Category": "Player",
      "Parameters": [
        {
          "name": "baseRagdoll",
          "typeName": "BaseRagdoll",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to validate a player's dismount position before exiting a mount or vehicle.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool AllowPlayerInstigatedDismount(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanRagdollDismount\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BaseRagdoll baseRagdoll, BasePlayer player",
      "TargetName": "BaseRagdoll",
      "MethodName": "AllowPlayerInstigatedDismount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1024438622,
      "Name": "CanUpdateSign",
      "FullName": "CanUpdateSign [PhotoFrame]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "photoFrame",
          "typeName": "PhotoFrame",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to update sign.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanUpdateSign(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUpdateSign\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player.IsAdmin || player.IsDeveloper)\n\t{\n\t\treturn true;\n\t}\n\tif (!player.CanBuild())\n\t{\n\t\treturn false;\n\t}\n\tif (IsLocked())\n\t{\n\t\treturn (ulong)player.userID == base.OwnerID;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, PhotoFrame photoFrame",
      "TargetName": "PhotoFrame",
      "MethodName": "CanUpdateSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3392492984,
      "Name": "OnLootEntityEnd",
      "FullName": "OnLootEntityEnd [ContainerIOEntity]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "containerIOEntity",
          "typeName": "ContainerIOEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot entity ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void PlayerStoppedLooting(BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnLootEntityEnd\", player, this);\n\tSetFlag(BaseEntity.Flags.Open, b: false);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BasePlayer player, ContainerIOEntity containerIOEntity",
      "TargetName": "ContainerIOEntity",
      "MethodName": "PlayerStoppedLooting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [ContainerIOEntity]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool PlayerOpenLoot(BasePlayer player, string panelToOpen = \"\", bool doPositionChecks = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) != null)\n\t{\n\t\treturn false;\n\t}\n\tif ((needsBuildingPrivilegeToUse || StorageContainer.ShouldRequireAuthIfNoCodelock(this, requireAuthIfNotLocked)) && !player.CanBuild())\n\t{\n\t\treturn false;\n\t}\n\tif (needsBuildingPrivilegeToUse && !player.CanBuild())\n\t{\n\t\treturn false;\n\t}\n\tif ((onlyOneUser && IsOpen()) || IsTransferring())\n\t{\n\t\tplayer.ShowToast(GameTip.Styles.Red_Normal, StorageContainer.LockedMessage, false);\n\t\treturn false;\n\t}\n\tif (panelToOpen == \"\")\n\t{\n\t\tpanelToOpen = lootPanelName;\n\t}\n\tif (!CanOpenLootPanel(player, panelToOpen))\n\t{\n\t\treturn false;\n\t}\n\tif (player.inventory.loot.StartLootingEntity(this, doPositionChecks))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Open, b: true);\n\t\tplayer.inventory.loot.AddContainer(_inventory);\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), panelToOpen);\n\t\tSendNetworkUpdate();\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "ContainerIOEntity",
      "MethodName": "PlayerOpenLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4075313892,
      "Name": "CanSwapToSeat",
      "FullName": "CanSwapToSeat [ModularCarSeat]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "modularCarSeat",
          "typeName": "ModularCarSeat",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to swap to seat.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool CanSwapToThis(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanSwapToSeat\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (associatedSeatingModule.DoorsAreLockable)\n\t{\n\t\tModularCar modularCar = associatedSeatingModule.Vehicle as ModularCar;\n\t\tif (modularCar != null)\n\t\t{\n\t\t\treturn modularCar.PlayerCanUseThis(player, ModularCarCodeLock.LockType.Door);\n\t\t}\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, ModularCarSeat modularCarSeat",
      "TargetName": "ModularCarSeat",
      "MethodName": "CanSwapToThis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 67342617,
      "Name": "CanUseGesture",
      "FullName": "CanUseGesture",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "gestureConfig",
          "typeName": "GestureConfig",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use gesture.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool IsOwnedBy(BasePlayer player, bool allowCinematic = false)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseGesture\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (forceUnlock)\n\t{\n\t\treturn true;\n\t}\n\tif (gestureType == GestureConfig.GestureType.NPC)\n\t{\n\t\tif (player != null)\n\t\t{\n\t\t\treturn player.IsNpc;\n\t\t}\n\t\treturn false;\n\t}\n\tif (gestureType == GestureConfig.GestureType.Cinematic)\n\t{\n\t\tif (!allowCinematic && (!(player != null) || !player.IsAdmin))\n\t\t{\n\t\t\treturn ConVar.Server.cinematic;\n\t\t}\n\t\treturn true;\n\t}\n\treturn IsUnlockedBy(player);\n}\n",
      "ParametersText": "BasePlayer player, GestureConfig gestureConfig",
      "TargetName": "GestureConfig",
      "MethodName": "IsOwnedBy",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3026774676,
      "Name": "OnClientCommand",
      "FullName": "OnClientCommand",
      "Category": "Player",
      "Parameters": [
        {
          "name": "connection",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static void OnClientCommand(Network.Message packet)\n{\n\tif (packet.read.Unread > ConVar.Server.maxpacketsize_command)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Dropping client command due to size\");\n\t\treturn;\n\t}\n\ttimer.Restart();\n\tstring text = packet.read.StringRaw(ConVar.Server.maxpacketsize_command);\n\tif (packet.connection == null || !packet.connection.connected)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Client without connection tried to run command: \" + text);\n\t}\n\telse if (Oxide.Core.Interface.CallHook(\"OnClientCommand\", packet.connection, text) == null)\n\t{\n\t\tConsoleSystem.CommandResult commandResult = ConsoleSystem.RunWithResult(ConsoleSystem.Option.Server.FromConnection(packet.connection).Quiet(), text);\n\t\tif (commandResult.Result == ConsoleSystem.CommandResultType.Success && (packet.connection.authLevel != 0 || (commandResult.Command.ServerAdmin && !commandResult.Command.ServerUser)))\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnClientRanCommand(packet.connection, text);\n\t\t}\n\t\tif (!string.IsNullOrEmpty(commandResult.Output))\n\t\t{\n\t\t\tSendClientReply(packet.connection, commandResult.Output);\n\t\t}\n\t\tif (timer.Elapsed > Facepunch.Rust.Profiling.RuntimeProfiler.ConsoleCommandWarningThreshold)\n\t\t{\n\t\t\tFacepunch.Rust.Profiling.LagSpikeProfiler.ConsoleCommand(timer.Elapsed, packet, text);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Network.Connection connection, string local0",
      "TargetName": "ConsoleNetwork",
      "MethodName": "OnClientCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3008356234,
      "Name": "CanSetRelationship",
      "FullName": "CanSetRelationship",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "otherPlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "type",
          "typeName": "RelationshipManager+RelationshipType",
          "optional": false
        },
        {
          "name": "weight",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to set relationship.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetRelationship(BasePlayer player, BasePlayer otherPlayer, RelationshipManager.RelationshipType type, int weight = 1, bool sendImmediate = false)\n{\n\tif (!contacts)\n\t{\n\t\treturn;\n\t}\n\tulong num = player.userID.Get();\n\tulong num2 = otherPlayer.userID.Get();\n\tif (player == null || player == otherPlayer || player.IsNpc || (otherPlayer != null && otherPlayer.IsNpc) || Oxide.Core.Interface.CallHook(\"CanSetRelationship\", player, otherPlayer, type, weight) != null)\n\t{\n\t\treturn;\n\t}\n\tRelationshipManager.PlayerRelationships playerRelationships = GetRelationships(num);\n\totherPlayer.requestingReputationUpdate = true;\n\tif (!CleanupOldContacts(playerRelationships, num))\n\t{\n\t\tCleanupOldContacts(playerRelationships, num, RelationshipManager.RelationshipType.Enemy);\n\t}\n\tRelationshipManager.PlayerRelationshipInfo relations = playerRelationships.GetRelations(num2);\n\tbool flag = false;\n\tif (relations.type != type)\n\t{\n\t\tflag = true;\n\t\trelations.weight = 0;\n\t}\n\trelations.type = type;\n\trelations.weight += weight;\n\tfloat num3 = UnityEngine.Time.realtimeSinceStartup - relations.lastMugshotTime;\n\tif (flag || relations.mugshotCrc == 0 || num3 >= mugshotUpdateInterval)\n\t{\n\t\tbool flag2 = otherPlayer.IsAlive();\n\t\tbool flag3 = player.SecondsSinceAttacked > 10f && !player.IsAiming;\n\t\tif (!player.IsPlayerVisibleToUs(otherPlayer, UnityEngine.Vector3.zero, 1218519041))\n\t\t{\n\t\t\tflag3 = false;\n\t\t}\n\t\tfloat num4 = 100f;\n\t\tif (flag3)\n\t\t{\n\t\t\tUnityEngine.Vector3 normalized = (otherPlayer.eyes.position - player.eyes.position).normalized;\n\t\t\tbool flag4 = UnityEngine.Vector3.Dot(player.eyes.HeadForward(), normalized) >= 0.6f;\n\t\t\tfloat num5 = UnityEngine.Vector3Ex.Distance2D(player.transform.position, otherPlayer.transform.position);\n\t\t\tif (flag2 && num5 < num4 && flag4)\n\t\t\t{\n\t\t\t\tClientRPC(RpcTarget.Player(\"CLIENT_DoMugshot\", player), num2);\n\t\t\t\trelations.lastMugshotTime = UnityEngine.Time.realtimeSinceStartup;\n\t\t\t}\n\t\t}\n\t}\n\tif (sendImmediate)\n\t{\n\t\tSendRelationshipsFor(player);\n\t}\n\telse\n\t{\n\t\tMarkRelationshipsDirtyFor(player);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BasePlayer otherPlayer, RelationshipManager.RelationshipType type, int weight",
      "TargetName": "RelationshipManager",
      "MethodName": "SetRelationship",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 837351664,
      "Name": "OnPlayerDrink",
      "FullName": "OnPlayerDrink",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "liquidContainer",
          "typeName": "LiquidContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player drink occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void SVDrink(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.metabolism.CanConsume() || Oxide.Core.Interface.CallHook(\"OnPlayerDrink\", rpc.player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tforeach (Item item in base.inventory.itemList)\n\t{\n\t\tItemModConsume component = item.info.GetComponent<ItemModConsume>();\n\t\tif (!(component == null) && component.CanDoAction(item, rpc.player))\n\t\t{\n\t\t\tcomponent.DoAction(item, rpc.player);\n\t\t\tbreak;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer player, LiquidContainer liquidContainer",
      "TargetName": "LiquidContainer",
      "MethodName": "SVDrink",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3392492984,
      "Name": "OnLootEntityEnd",
      "FullName": "OnLootEntityEnd [FuseBox]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "itemBasedFlowRestrictor",
          "typeName": "ItemBasedFlowRestrictor",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot entity ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PlayerStoppedLooting(BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnLootEntityEnd\", player, this);\n}\n",
      "ParametersText": "BasePlayer player, ItemBasedFlowRestrictor itemBasedFlowRestrictor",
      "TargetName": "ItemBasedFlowRestrictor",
      "MethodName": "PlayerStoppedLooting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1024438622,
      "Name": "CanUpdateSign",
      "FullName": "CanUpdateSign [CarvablePumpkin]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "carvablePumpkin",
          "typeName": "CarvablePumpkin",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to update sign.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanUpdateSign(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUpdateSign\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player.IsAdmin || player.IsDeveloper)\n\t{\n\t\treturn true;\n\t}\n\tif (!player.CanBuild())\n\t{\n\t\treturn false;\n\t}\n\tif (IsLocked())\n\t{\n\t\treturn (ulong)player.userID == base.OwnerID;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, CarvablePumpkin carvablePumpkin",
      "TargetName": "CarvablePumpkin",
      "MethodName": "CanUpdateSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1230915907,
      "Name": "OnEyePosValidate",
      "FullName": "OnEyePosValidate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "attackEntity",
          "typeName": "AttackEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "eyePos",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "checkLineOfSight",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an eye pos is validated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected bool ValidateEyePos(BasePlayer player, UnityEngine.Vector3 eyePos, bool checkLineOfSight = true)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnEyePosValidate\", this, player, eyePos, checkLineOfSight);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tbool flag = true;\n\tif (UnityEngine.Vector3Ex.IsNaNOrInfinity(eyePos))\n\t{\n\t\tstring shortPrefabName = base.ShortPrefabName;\n\t\tAntiHack.Log(player, AntiHackType.EyeHack, \"Contains NaN (\" + shortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"eye_nan\");\n\t\tflag = false;\n\t}\n\tif (ConVar.AntiHack.eye_protection > 0)\n\t{\n\t\tif (ConVar.AntiHack.eye_protection >= 1)\n\t\t{\n\t\t\tfloat num = player.GetParentVelocity().magnitude + player.GetMountVelocity().magnitude;\n\t\t\tfloat num2 = ((((player.HasParent() || player.isMounted) ? ConVar.AntiHack.eye_distance_parented_mounted_forgiveness : 0f) + player.estimatedSpeed > 0f) ? ConVar.AntiHack.eye_forgiveness : 0f);\n\t\t\tfloat num3 = num + num2;\n\t\t\tfloat num4 = player.tickHistory.Distance(player, eyePos);\n\t\t\tif (num4 > num3)\n\t\t\t{\n\t\t\t\tstring shortPrefabName2 = base.ShortPrefabName;\n\t\t\t\tAntiHack.Log(player, AntiHackType.EyeHack, $\"Distance ({shortPrefabName2} on attack with {num4}m > {num3}m)\");\n\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"eye_distance\");\n\t\t\t\tflag = false;\n\t\t\t}\n\t\t}\n\t\tif (ConVar.AntiHack.eye_protection >= 3)\n\t\t{\n\t\t\tfloat num5 = UnityEngine.Mathf.Abs(player.GetMountVelocity().y + player.GetParentVelocity().y) + BasePlayer.GetJumpHeight();\n\t\t\tfloat num6 = UnityEngine.Mathf.Abs(player.eyes.position.y - eyePos.y);\n\t\t\tif (num6 > num5)\n\t\t\t{\n\t\t\t\tstring shortPrefabName3 = base.ShortPrefabName;\n\t\t\t\tAntiHack.Log(player, AntiHackType.EyeHack, $\"Altitude ({shortPrefabName3} on attack with {num6}m > {num5}m)\");\n\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"eye_altitude\");\n\t\t\t\tflag = false;\n\t\t\t}\n\t\t}\n\t\tif (checkLineOfSight)\n\t\t{\n\t\t\tint num7 = 2162688;\n\t\t\tif (ConVar.AntiHack.eye_terraincheck)\n\t\t\t{\n\t\t\t\tnum7 |= 0x800000;\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.eye_vehiclecheck)\n\t\t\t{\n\t\t\t\tnum7 |= 0x8000000;\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.eye_protection >= 2)\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 center = player.eyes.center;\n\t\t\t\tUnityEngine.Vector3 position = player.eyes.position;\n\t\t\t\tUnityEngine.Vector3 vector = eyePos;\n\t\t\t\tif (!GamePhysics.LineOfSightRadius(center, position, num7, ConVar.AntiHack.eye_losradius) || !GamePhysics.LineOfSightRadius(position, vector, num7, ConVar.AntiHack.eye_losradius))\n\t\t\t\t{\n\t\t\t\t\tstring shortPrefabName4 = base.ShortPrefabName;\n\t\t\t\t\tAntiHack.Log(player, AntiHackType.EyeHack, $\"Line of sight ({shortPrefabName4} on attack) {center} {position} {vector}\");\n\t\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"eye_los\");\n\t\t\t\t\tflag = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ConVar.AntiHack.eye_protection >= 4 && !player.HasParent())\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 position2 = player.eyes.position;\n\t\t\t\tUnityEngine.Vector3 vector2 = eyePos;\n\t\t\t\tfloat num8 = UnityEngine.Vector3.Distance(position2, vector2);\n\t\t\t\tUnityEngine.Collider col;\n\t\t\t\tif (num8 > ConVar.AntiHack.eye_noclip_cutoff)\n\t\t\t\t{\n\t\t\t\t\tif (AntiHack.TestNoClipping(player, position2, vector2, BasePlayer.NoClipRadius(ConVar.AntiHack.eye_noclip_margin), ConVar.AntiHack.eye_noclip_backtracking, out col, overlapVehicleLayer: false, null, forceCast: true))\n\t\t\t\t\t{\n\t\t\t\t\t\tstring shortPrefabName5 = base.ShortPrefabName;\n\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.EyeHack, $\"NoClip (cutoff) ({shortPrefabName5} on attack) {position2} {vector2}\");\n\t\t\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"eye_noclip_cutoff\");\n\t\t\t\t\t\tflag = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if (num8 > 0.01f && AntiHack.TestNoClipping(player, position2, vector2, 0.1f, ConVar.AntiHack.eye_noclip_backtracking, out col, overlapVehicleLayer: false, null, forceCast: true))\n\t\t\t\t{\n\t\t\t\t\tstring shortPrefabName6 = base.ShortPrefabName;\n\t\t\t\t\tAntiHack.Log(player, AntiHackType.EyeHack, $\"NoClip ({shortPrefabName6} on attack) {position2} {vector2}\");\n\t\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"eye_noclip\");\n\t\t\t\t\tflag = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tAntiHack.AddViolation(player, AntiHackType.EyeHack, ConVar.AntiHack.eye_penalty);\n\t\t}\n\t\telse if (ConVar.AntiHack.eye_protection >= 5 && !player.HasParent() && !player.isMounted)\n\t\t{\n\t\t\tplayer.eyeHistory.PushBack(eyePos);\n\t\t}\n\t}\n\treturn flag;\n}\n",
      "ParametersText": "AttackEntity attackEntity, BasePlayer player, UnityEngine.Vector3 eyePos, bool checkLineOfSight",
      "TargetName": "AttackEntity",
      "MethodName": "ValidateEyePos",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2391744511,
      "Name": "OnClientProjectileEffectCreate",
      "FullName": "OnClientProjectileEffectCreate",
      "Category": "Player",
      "Parameters": [
        {
          "name": "sourceConnection",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "baseProjectile",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "prefabName",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a client projectile effect is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void CreateProjectileEffectClientside(string prefabName, UnityEngine.Vector3 pos, UnityEngine.Vector3 velocity, int seed, Network.Connection sourceConnection, bool silenced = false, bool forceClientsideEffects = false, System.Collections.Generic.List<Network.Connection> targets = null, float distanceOverride = 0f)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnClientProjectileEffectCreate\", sourceConnection, this, prefabName) == null)\n\t{\n\t\tEffect effect = reusableInstance;\n\t\teffect.InitWithSourceEntity(Effect.Type.Projectile, this, pos, velocity, sourceConnection);\n\t\teffect.scale = (silenced ? 0f : 1f);\n\t\tif (forceClientsideEffects)\n\t\t{\n\t\t\teffect.scale = 2f;\n\t\t}\n\t\teffect.pooledString = prefabName;\n\t\teffect.number = seed;\n\t\teffect.targets = targets;\n\t\teffect.distanceOverride = distanceOverride;\n\t\tEffectNetwork.Send(effect);\n\t}\n}\n",
      "ParametersText": "Network.Connection sourceConnection, BaseProjectile baseProjectile, string prefabName",
      "TargetName": "BaseProjectile",
      "MethodName": "CreateProjectileEffectClientside",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 140408349,
      "Name": "OnPlayerBanned",
      "FullName": "OnPlayerBanned [EAC]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local2",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "toString()",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is banned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private static void OnClientActionRequired(ref Epic.OnlineServices.AntiCheatCommon.OnClientActionRequiredCallbackInfo data)\n{\n\tusing (TimeWarning.New(\"OnClientActionRequired\", 10))\n\t{\n\t\tSystem.IntPtr clientHandle = data.ClientHandle;\n\t\tNetwork.Connection connection = GetConnection(clientHandle);\n\t\tif (connection == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(\"[EAC] Status update for invalid client: \" + clientHandle);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (data.ClientAction != Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientAction.RemovePlayer)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tEpic.OnlineServices.Utf8String actionReasonDetailsString = data.ActionReasonDetailsString;\n\t\t\tif (connection.IsDevelopmentBuild())\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning(\"[EAC] Remove player action skipped for unprotected client: \" + connection.ToString());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tUnityEngine.Debug.Log($\"[EAC] Kicking {connection.userid} / {connection.username} ({actionReasonDetailsString})\");\n\t\t\tconnection.authStatusEAC = \"eac\";\n\t\t\tNetwork.Net.sv.Kick(connection, \"EAC: \" + actionReasonDetailsString);\n\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerKicked\", connection, actionReasonDetailsString.ToString());\n\t\t\tif (data.ActionReasonCode == Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientActionReason.PermanentBanned || data.ActionReasonCode == Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientActionReason.TemporaryBanned)\n\t\t\t{\n\t\t\t\tconnection.authStatusEAC = \"eacbanned\";\n\t\t\t\tConsoleNetwork.BroadcastToAllClients(\"chat.add\", 2, 0, \"<color=#fff>SERVER</color> Kicking \" + connection.username + \" (banned by anticheat)\");\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerBanned\", connection, actionReasonDetailsString.ToString());\n\t\t\t\tif (data.ActionReasonCode == Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientActionReason.PermanentBanned)\n\t\t\t\t{\n\t\t\t\t\tConVar.Entity.DeleteBy(connection.userid);\n\t\t\t\t}\n\t\t\t}\n\t\t\tEpic.OnlineServices.AntiCheatServer.UnregisterClientOptions unregisterClientOptions = default(Epic.OnlineServices.AntiCheatServer.UnregisterClientOptions);\n\t\t\tunregisterClientOptions.ClientHandle = clientHandle;\n\t\t\tEpic.OnlineServices.AntiCheatServer.UnregisterClientOptions options = unregisterClientOptions;\n\t\t\tInterface.UnregisterClient(ref options);\n\t\t\tclient2connection.TryRemove((uint)(int)clientHandle, out var _);\n\t\t\tconnection2client.TryRemove(connection, out var _);\n\t\t\tconnection2status.TryRemove(connection, out var _);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Network.Connection local2, string toString()",
      "TargetName": "EACServer",
      "MethodName": "OnClientActionRequired",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1321158727,
      "Name": "OnPlayerKicked",
      "FullName": "OnPlayerKicked [EAC]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local2",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "toString()",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is kicked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private static void OnClientActionRequired(ref Epic.OnlineServices.AntiCheatCommon.OnClientActionRequiredCallbackInfo data)\n{\n\tusing (TimeWarning.New(\"OnClientActionRequired\", 10))\n\t{\n\t\tSystem.IntPtr clientHandle = data.ClientHandle;\n\t\tNetwork.Connection connection = GetConnection(clientHandle);\n\t\tif (connection == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(\"[EAC] Status update for invalid client: \" + clientHandle);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (data.ClientAction != Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientAction.RemovePlayer)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tEpic.OnlineServices.Utf8String actionReasonDetailsString = data.ActionReasonDetailsString;\n\t\t\tif (connection.IsDevelopmentBuild())\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning(\"[EAC] Remove player action skipped for unprotected client: \" + connection.ToString());\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tUnityEngine.Debug.Log($\"[EAC] Kicking {connection.userid} / {connection.username} ({actionReasonDetailsString})\");\n\t\t\tconnection.authStatusEAC = \"eac\";\n\t\t\tNetwork.Net.sv.Kick(connection, \"EAC: \" + actionReasonDetailsString);\n\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerKicked\", connection, actionReasonDetailsString.ToString());\n\t\t\tif (data.ActionReasonCode == Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientActionReason.PermanentBanned || data.ActionReasonCode == Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientActionReason.TemporaryBanned)\n\t\t\t{\n\t\t\t\tconnection.authStatusEAC = \"eacbanned\";\n\t\t\t\tConsoleNetwork.BroadcastToAllClients(\"chat.add\", 2, 0, \"<color=#fff>SERVER</color> Kicking \" + connection.username + \" (banned by anticheat)\");\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnPlayerBanned\", connection, actionReasonDetailsString.ToString());\n\t\t\t\tif (data.ActionReasonCode == Epic.OnlineServices.AntiCheatCommon.AntiCheatCommonClientActionReason.PermanentBanned)\n\t\t\t\t{\n\t\t\t\t\tConVar.Entity.DeleteBy(connection.userid);\n\t\t\t\t}\n\t\t\t}\n\t\t\tEpic.OnlineServices.AntiCheatServer.UnregisterClientOptions unregisterClientOptions = default(Epic.OnlineServices.AntiCheatServer.UnregisterClientOptions);\n\t\t\tunregisterClientOptions.ClientHandle = clientHandle;\n\t\t\tEpic.OnlineServices.AntiCheatServer.UnregisterClientOptions options = unregisterClientOptions;\n\t\t\tInterface.UnregisterClient(ref options);\n\t\t\tclient2connection.TryRemove((uint)(int)clientHandle, out var _);\n\t\t\tconnection2client.TryRemove(connection, out var _);\n\t\t\tconnection2status.TryRemove(connection, out var _);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Network.Connection local2, string toString()",
      "TargetName": "EACServer",
      "MethodName": "OnClientActionRequired",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3060283875,
      "Name": "OnPortalUse",
      "FullName": "OnPortalUse",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "basePortal",
          "typeName": "BasePortal",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a portal uses."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void UsePortal(BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPortalUse\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tLinkPortal();\n\tif (targetPortal != null)\n\t{\n\t\tplayer.PauseFlyHackDetection();\n\t\tplayer.PauseSpeedHackDetection();\n\t\tplayer.ApplyStallProtection(4f);\n\t\tUnityEngine.Vector3 position = player.transform.position;\n\t\tUnityEngine.Vector3 vector = targetPortal.GetLocalEntryExitPosition();\n\t\tUnityEngine.Vector3 vector2 = base.transform.InverseTransformDirection(player.eyes.BodyForward());\n\t\tUnityEngine.Vector3 vector3 = vector2;\n\t\tif (isMirrored)\n\t\t{\n\t\t\tUnityEngine.Vector3 position2 = base.transform.InverseTransformPoint(player.transform.position);\n\t\t\tvector = targetPortal.relativeAnchor.transform.TransformPoint(position2);\n\t\t\tvector3 = targetPortal.relativeAnchor.transform.TransformDirection(vector2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvector3 = targetPortal.GetLocalEntryExitRotation() * UnityEngine.Vector3.forward;\n\t\t}\n\t\tif (disappearEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(disappearEffect.resourcePath, position, UnityEngine.Vector3.up);\n\t\t}\n\t\tif (appearEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(appearEffect.resourcePath, vector, UnityEngine.Vector3.up);\n\t\t}\n\t\tplayer.ClientRPC(RpcTarget.Player(\"StartLoading_Quick\", player), arg1: true);\n\t\tplayer.SetParent(null, worldPositionStays: true);\n\t\tplayer.Teleport(vector);\n\t\tplayer.ClientRPC(RpcTarget.Player(\"ForceViewAnglesTo\", player), vector3);\n\t\tif (transitionSoundEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(transitionSoundEffect.resourcePath, targetPortal.relativeAnchor.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tplayer.UpdateNetworkGroup();\n\t\tplayer.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, b: true);\n\t\tSendNetworkUpdateImmediate();\n\t\tOxide.Core.Interface.CallHook(\"OnPortalUsed\", player, this);\n\t}\n\telse\n\t{\n\t\tUnityEngine.Debug.Log(\"No portal...\");\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BasePortal basePortal",
      "TargetName": "BasePortal",
      "MethodName": "UsePortal",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1651465834,
      "Name": "OnPortalUsed",
      "FullName": "OnPortalUsed",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "basePortal",
          "typeName": "BasePortal",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a portal is used."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void UsePortal(BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPortalUse\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tLinkPortal();\n\tif (targetPortal != null)\n\t{\n\t\tplayer.PauseFlyHackDetection();\n\t\tplayer.PauseSpeedHackDetection();\n\t\tplayer.ApplyStallProtection(4f);\n\t\tUnityEngine.Vector3 position = player.transform.position;\n\t\tUnityEngine.Vector3 vector = targetPortal.GetLocalEntryExitPosition();\n\t\tUnityEngine.Vector3 vector2 = base.transform.InverseTransformDirection(player.eyes.BodyForward());\n\t\tUnityEngine.Vector3 vector3 = vector2;\n\t\tif (isMirrored)\n\t\t{\n\t\t\tUnityEngine.Vector3 position2 = base.transform.InverseTransformPoint(player.transform.position);\n\t\t\tvector = targetPortal.relativeAnchor.transform.TransformPoint(position2);\n\t\t\tvector3 = targetPortal.relativeAnchor.transform.TransformDirection(vector2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvector3 = targetPortal.GetLocalEntryExitRotation() * UnityEngine.Vector3.forward;\n\t\t}\n\t\tif (disappearEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(disappearEffect.resourcePath, position, UnityEngine.Vector3.up);\n\t\t}\n\t\tif (appearEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(appearEffect.resourcePath, vector, UnityEngine.Vector3.up);\n\t\t}\n\t\tplayer.ClientRPC(RpcTarget.Player(\"StartLoading_Quick\", player), arg1: true);\n\t\tplayer.SetParent(null, worldPositionStays: true);\n\t\tplayer.Teleport(vector);\n\t\tplayer.ClientRPC(RpcTarget.Player(\"ForceViewAnglesTo\", player), vector3);\n\t\tif (transitionSoundEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(transitionSoundEffect.resourcePath, targetPortal.relativeAnchor.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tplayer.UpdateNetworkGroup();\n\t\tplayer.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, b: true);\n\t\tSendNetworkUpdateImmediate();\n\t\tOxide.Core.Interface.CallHook(\"OnPortalUsed\", player, this);\n\t}\n\telse\n\t{\n\t\tUnityEngine.Debug.Log(\"No portal...\");\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BasePortal basePortal",
      "TargetName": "BasePortal",
      "MethodName": "UsePortal",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2118405101,
      "Name": "CanUnlock",
      "FullName": "CanUnlock [ModularCarCodeLock]",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "modularCarCodeLock",
          "typeName": "ModularCarCodeLock",
          "optional": false
        },
        {
          "name": "codeEntered",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to unlock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool TryOpenWithCode(BasePlayer player, string codeEntered)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUnlock\", player, this, codeEntered);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (CodeEntryBlocked(player))\n\t{\n\t\treturn false;\n\t}\n\tif (!(codeEntered == Code))\n\t{\n\t\tif (UnityEngine.Time.realtimeSinceStartup > lastWrongTime + 60f)\n\t\t{\n\t\t\twrongCodes = 0;\n\t\t}\n\t\tplayer.Hurt((float)(wrongCodes + 1) * 5f, Rust.DamageType.ElectricShock, owner, useProtection: false);\n\t\twrongCodes++;\n\t\tif (wrongCodes > 5)\n\t\t{\n\t\t\tplayer.ShowToast(GameTip.Styles.Red_Normal, CodeLock.blockwarning, false);\n\t\t}\n\t\tif ((float)wrongCodes >= CodeLock.maxFailedAttempts)\n\t\t{\n\t\t\towner.SetFlag(BaseEntity.Flags.Reserved10, b: true);\n\t\t\towner.Invoke(ClearCodeEntryBlocked, CodeLock.lockoutCooldown);\n\t\t}\n\t\tlastWrongTime = UnityEngine.Time.realtimeSinceStartup;\n\t\treturn false;\n\t}\n\tif (TryAddPlayer(player.userID))\n\t{\n\t\twrongCodes = 0;\n\t}\n\towner.SendNetworkUpdate();\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, ModularCarCodeLock modularCarCodeLock, string codeEntered",
      "TargetName": "ModularCarCodeLock",
      "MethodName": "TryOpenWithCode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1089357290,
      "Name": "OnPlayerDig",
      "FullName": "OnPlayerDig",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "baseDiggableEntity",
          "typeName": "BaseDiggableEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when player dig occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Dig(BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPlayerDig\", player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (digsRemaining == RequiredDigCount)\n\t{\n\t\tOnFirstDig(player);\n\t}\n\tClientRPC(RpcTarget.NetworkGroup(\"RPC_OnDig\"), RequiredDigCount - digsRemaining, RequiredDigCount);\n\tdigsRemaining--;\n\tbase.health = digsRemaining;\n\tSendNetworkUpdate();\n\tOnSingleDig(player);\n\tif (digsRemaining <= 0)\n\t{\n\t\tOnFullyDug(player);\n\t\tif (DestroyOnDug)\n\t\t{\n\t\t\tKill();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BaseDiggableEntity baseDiggableEntity",
      "TargetName": "BaseDiggableEntity",
      "MethodName": "Dig",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1065397392,
      "Name": "OnMetalDetectorFlagRequest",
      "FullName": "OnMetalDetectorFlagRequest",
      "Category": "Player",
      "Parameters": [
        {
          "name": "baseMetalDetector",
          "typeName": "BaseMetalDetector",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when metal detector flag request occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(UnityEngine.Vector3) })]\n[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server]\nprivate void RPC_RequestFlag(BaseEntity.RPCMessage rpc)\n{\n\tBasePlayer player = rpc.player;\n\tif (!(player == null) && !player.InSafeZone() && nearestSource != null)\n\t{\n\t\tUnityEngine.Vector3 vector = rpc.read.Vector3();\n\t\tOxide.Core.Interface.CallHook(\"OnMetalDetectorFlagRequest\", this, vector, player);\n\t\tif (nearestSource.VerifyScanPosition(player.transform.position, vector, out var spotPos))\n\t\t{\n\t\t\tnearestSource.Detected(spotPos);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseMetalDetector baseMetalDetector, UnityEngine.Vector3 local1, BasePlayer local0",
      "TargetName": "BaseMetalDetector",
      "MethodName": "RPC_RequestFlag",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1634954413,
      "Name": "CanUseHBHFSensor",
      "FullName": "CanUseHBHFSensor",
      "Category": "Player",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "hBHFSensor",
          "typeName": "HBHFSensor",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use hbhf sensor.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanUse(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseHBHFSensor\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn player.CanBuild();\n}\n",
      "ParametersText": "BasePlayer player, HBHFSensor hBHFSensor",
      "TargetName": "HBHFSensor",
      "MethodName": "CanUse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1370523975,
      "Name": "OnPlayerHandcuff",
      "FullName": "OnPlayerHandcuff",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when player handcuff occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SV_HandcuffVictim(BasePlayer victim, BasePlayer handcuffer)\n{\n\tif (victim == null || handcuffer == null || victim.IsRestrained || (!victim.CurrentGestureIsSurrendering && !victim.IsWounded()) || UnityEngine.Vector3.Distance(victim.transform.position, handcuffer.transform.position) > UseDistance)\n\t{\n\t\treturn;\n\t}\n\tItem ownerItem = GetOwnerItem();\n\tif (ownerItem == null || Oxide.Core.Interface.CallHook(\"OnPlayerHandcuff\", victim, handcuffer) != null)\n\t{\n\t\treturn;\n\t}\n\tvictim.SetPlayerFlag(BasePlayer.PlayerFlags.IsRestrained, b: true);\n\tvictim.SendNetworkUpdateImmediate();\n\townerItem.SetFlag(Item.Flag.IsOn, b: true);\n\tbool flag = true;\n\tif (!ownerItem.MoveToContainer(victim.inventory.containerBelt))\n\t{\n\t\tItem slot = victim.inventory.containerBelt.GetSlot(0);\n\t\tif (slot != null)\n\t\t{\n\t\t\tif (!slot.MoveToContainer(victim.inventory.containerMain))\n\t\t\t{\n\t\t\t\tif (slot.contents != null)\n\t\t\t\t{\n\t\t\t\t\tslot.contents.SetLocked(isLocked: false, lockSubItems: true);\n\t\t\t\t}\n\t\t\t\tslot.DropAndTossUpwards(victim.transform.position);\n\t\t\t}\n\t\t\tif (!ownerItem.MoveToContainer(victim.inventory.containerBelt))\n\t\t\t{\n\t\t\t\tflag = false;\n\t\t\t}\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\townerItem.SetFlag(Item.Flag.IsOn, b: false);\n\t\tvictim.SetPlayerFlag(BasePlayer.PlayerFlags.IsRestrained, b: false);\n\t}\n\townerItem.MarkDirty();\n\tif (flag)\n\t{\n\t\tvictim.Server_CancelGesture();\n\t\tif (victim.IsBot)\n\t\t{\n\t\t\tConVar.Inventory.EquipItemInSlot(victim, 0);\n\t\t}\n\t\tvictim.ClientRPC(RpcTarget.Player(\"SetActiveBeltSlot\", victim), ownerItem.position, ownerItem.uid);\n\t\tSetLocked(flag: true, victim, ownerItem);\n\t\tEffect.server.Run(lockEffect.resourcePath, victim, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerHandcuffed\", victim, handcuffer);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Handcuffs",
      "MethodName": "SV_HandcuffVictim",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 799421953,
      "Name": "OnPlayerHandcuffed",
      "FullName": "OnPlayerHandcuffed",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is handcuffed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SV_HandcuffVictim(BasePlayer victim, BasePlayer handcuffer)\n{\n\tif (victim == null || handcuffer == null || victim.IsRestrained || (!victim.CurrentGestureIsSurrendering && !victim.IsWounded()) || UnityEngine.Vector3.Distance(victim.transform.position, handcuffer.transform.position) > UseDistance)\n\t{\n\t\treturn;\n\t}\n\tItem ownerItem = GetOwnerItem();\n\tif (ownerItem == null || Oxide.Core.Interface.CallHook(\"OnPlayerHandcuff\", victim, handcuffer) != null)\n\t{\n\t\treturn;\n\t}\n\tvictim.SetPlayerFlag(BasePlayer.PlayerFlags.IsRestrained, b: true);\n\tvictim.SendNetworkUpdateImmediate();\n\townerItem.SetFlag(Item.Flag.IsOn, b: true);\n\tbool flag = true;\n\tif (!ownerItem.MoveToContainer(victim.inventory.containerBelt))\n\t{\n\t\tItem slot = victim.inventory.containerBelt.GetSlot(0);\n\t\tif (slot != null)\n\t\t{\n\t\t\tif (!slot.MoveToContainer(victim.inventory.containerMain))\n\t\t\t{\n\t\t\t\tif (slot.contents != null)\n\t\t\t\t{\n\t\t\t\t\tslot.contents.SetLocked(isLocked: false, lockSubItems: true);\n\t\t\t\t}\n\t\t\t\tslot.DropAndTossUpwards(victim.transform.position);\n\t\t\t}\n\t\t\tif (!ownerItem.MoveToContainer(victim.inventory.containerBelt))\n\t\t\t{\n\t\t\t\tflag = false;\n\t\t\t}\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\townerItem.SetFlag(Item.Flag.IsOn, b: false);\n\t\tvictim.SetPlayerFlag(BasePlayer.PlayerFlags.IsRestrained, b: false);\n\t}\n\townerItem.MarkDirty();\n\tif (flag)\n\t{\n\t\tvictim.Server_CancelGesture();\n\t\tif (victim.IsBot)\n\t\t{\n\t\t\tConVar.Inventory.EquipItemInSlot(victim, 0);\n\t\t}\n\t\tvictim.ClientRPC(RpcTarget.Player(\"SetActiveBeltSlot\", victim), ownerItem.position, ownerItem.uid);\n\t\tSetLocked(flag: true, victim, ownerItem);\n\t\tEffect.server.Run(lockEffect.resourcePath, victim, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerHandcuffed\", victim, handcuffer);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Handcuffs",
      "MethodName": "SV_HandcuffVictim",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3714342131,
      "Name": "OnPlayerVanish",
      "FullName": "OnPlayerVanish",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerVar(Help = \"Make admin invisible\")]\npublic static void invis(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (basePlayer == null)\n\t{\n\t\treturn;\n\t}\n\tbool @bool = arg.GetBool(0, !basePlayer.isInvisible);\n\tif (@bool && !basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerVanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (Network.Connection subscriber in basePlayer.net.group.subscribers)\n\t\t{\n\t\t\tBasePlayer basePlayer2 = subscriber.player as BasePlayer;\n\t\t\tif (subscriber != basePlayer.net.connection && basePlayer.ShouldNetworkTo(basePlayer2) && !basePlayer2.IsSpectating())\n\t\t\t{\n\t\t\t\tbasePlayer.DestroyOnClient(subscriber);\n\t\t\t}\n\t\t}\n\t\tif (ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tbasePlayer.OcclusionMakeSubscribersForget();\n\t\t}\n\t\tbasePlayer.isInvisible = true;\n\t\tBasePlayer.invisPlayers.Add(basePlayer);\n\t\tbasePlayer.DisablePlayerCollider();\n\t\tRust.Ai.SimpleAIMemory.AddIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerVanished\", basePlayer);\n\t}\n\telse if (!@bool && basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerUnvanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbasePlayer.isInvisible = false;\n\t\tBasePlayer.invisPlayers.Remove(basePlayer);\n\t\tbasePlayer.EnablePlayerCollider();\n\t\tif (!ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tforeach (Network.Connection subscriber2 in basePlayer.net.group.subscribers)\n\t\t\t{\n\t\t\t\tBasePlayer player = subscriber2.player as BasePlayer;\n\t\t\t\tif (basePlayer.ShouldNetworkTo(player))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer.SendAsSnapshotWithChildren(player);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRust.Ai.SimpleAIMemory.RemoveIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.AddPlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerUnvanished\", basePlayer);\n\t}\n\targ.ReplyWith(\"Invis: \" + basePlayer.isInvisible);\n\tbasePlayer.Command(\"debug.setinvis_ui\", basePlayer.isInvisible);\n}\n",
      "ParametersText": "BasePlayer local0",
      "TargetName": "ConVar.Debugging",
      "MethodName": "invis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2084189832,
      "Name": "OnPlayerVanished",
      "FullName": "OnPlayerVanished",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerVar(Help = \"Make admin invisible\")]\npublic static void invis(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (basePlayer == null)\n\t{\n\t\treturn;\n\t}\n\tbool @bool = arg.GetBool(0, !basePlayer.isInvisible);\n\tif (@bool && !basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerVanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (Network.Connection subscriber in basePlayer.net.group.subscribers)\n\t\t{\n\t\t\tBasePlayer basePlayer2 = subscriber.player as BasePlayer;\n\t\t\tif (subscriber != basePlayer.net.connection && basePlayer.ShouldNetworkTo(basePlayer2) && !basePlayer2.IsSpectating())\n\t\t\t{\n\t\t\t\tbasePlayer.DestroyOnClient(subscriber);\n\t\t\t}\n\t\t}\n\t\tif (ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tbasePlayer.OcclusionMakeSubscribersForget();\n\t\t}\n\t\tbasePlayer.isInvisible = true;\n\t\tBasePlayer.invisPlayers.Add(basePlayer);\n\t\tbasePlayer.DisablePlayerCollider();\n\t\tRust.Ai.SimpleAIMemory.AddIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerVanished\", basePlayer);\n\t}\n\telse if (!@bool && basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerUnvanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbasePlayer.isInvisible = false;\n\t\tBasePlayer.invisPlayers.Remove(basePlayer);\n\t\tbasePlayer.EnablePlayerCollider();\n\t\tif (!ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tforeach (Network.Connection subscriber2 in basePlayer.net.group.subscribers)\n\t\t\t{\n\t\t\t\tBasePlayer player = subscriber2.player as BasePlayer;\n\t\t\t\tif (basePlayer.ShouldNetworkTo(player))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer.SendAsSnapshotWithChildren(player);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRust.Ai.SimpleAIMemory.RemoveIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.AddPlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerUnvanished\", basePlayer);\n\t}\n\targ.ReplyWith(\"Invis: \" + basePlayer.isInvisible);\n\tbasePlayer.Command(\"debug.setinvis_ui\", basePlayer.isInvisible);\n}\n",
      "ParametersText": "BasePlayer local0",
      "TargetName": "ConVar.Debugging",
      "MethodName": "invis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1836626967,
      "Name": "OnPlayerUnvanish",
      "FullName": "OnPlayerUnvanish",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerVar(Help = \"Make admin invisible\")]\npublic static void invis(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (basePlayer == null)\n\t{\n\t\treturn;\n\t}\n\tbool @bool = arg.GetBool(0, !basePlayer.isInvisible);\n\tif (@bool && !basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerVanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (Network.Connection subscriber in basePlayer.net.group.subscribers)\n\t\t{\n\t\t\tBasePlayer basePlayer2 = subscriber.player as BasePlayer;\n\t\t\tif (subscriber != basePlayer.net.connection && basePlayer.ShouldNetworkTo(basePlayer2) && !basePlayer2.IsSpectating())\n\t\t\t{\n\t\t\t\tbasePlayer.DestroyOnClient(subscriber);\n\t\t\t}\n\t\t}\n\t\tif (ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tbasePlayer.OcclusionMakeSubscribersForget();\n\t\t}\n\t\tbasePlayer.isInvisible = true;\n\t\tBasePlayer.invisPlayers.Add(basePlayer);\n\t\tbasePlayer.DisablePlayerCollider();\n\t\tRust.Ai.SimpleAIMemory.AddIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerVanished\", basePlayer);\n\t}\n\telse if (!@bool && basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerUnvanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbasePlayer.isInvisible = false;\n\t\tBasePlayer.invisPlayers.Remove(basePlayer);\n\t\tbasePlayer.EnablePlayerCollider();\n\t\tif (!ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tforeach (Network.Connection subscriber2 in basePlayer.net.group.subscribers)\n\t\t\t{\n\t\t\t\tBasePlayer player = subscriber2.player as BasePlayer;\n\t\t\t\tif (basePlayer.ShouldNetworkTo(player))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer.SendAsSnapshotWithChildren(player);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRust.Ai.SimpleAIMemory.RemoveIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.AddPlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerUnvanished\", basePlayer);\n\t}\n\targ.ReplyWith(\"Invis: \" + basePlayer.isInvisible);\n\tbasePlayer.Command(\"debug.setinvis_ui\", basePlayer.isInvisible);\n}\n",
      "ParametersText": "BasePlayer local0",
      "TargetName": "ConVar.Debugging",
      "MethodName": "invis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1457859582,
      "Name": "OnPlayerUnvanished",
      "FullName": "OnPlayerUnvanished",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerVar(Help = \"Make admin invisible\")]\npublic static void invis(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (basePlayer == null)\n\t{\n\t\treturn;\n\t}\n\tbool @bool = arg.GetBool(0, !basePlayer.isInvisible);\n\tif (@bool && !basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerVanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (Network.Connection subscriber in basePlayer.net.group.subscribers)\n\t\t{\n\t\t\tBasePlayer basePlayer2 = subscriber.player as BasePlayer;\n\t\t\tif (subscriber != basePlayer.net.connection && basePlayer.ShouldNetworkTo(basePlayer2) && !basePlayer2.IsSpectating())\n\t\t\t{\n\t\t\t\tbasePlayer.DestroyOnClient(subscriber);\n\t\t\t}\n\t\t}\n\t\tif (ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tbasePlayer.OcclusionMakeSubscribersForget();\n\t\t}\n\t\tbasePlayer.isInvisible = true;\n\t\tBasePlayer.invisPlayers.Add(basePlayer);\n\t\tbasePlayer.DisablePlayerCollider();\n\t\tRust.Ai.SimpleAIMemory.AddIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerVanished\", basePlayer);\n\t}\n\telse if (!@bool && basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerUnvanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbasePlayer.isInvisible = false;\n\t\tBasePlayer.invisPlayers.Remove(basePlayer);\n\t\tbasePlayer.EnablePlayerCollider();\n\t\tif (!ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tforeach (Network.Connection subscriber2 in basePlayer.net.group.subscribers)\n\t\t\t{\n\t\t\t\tBasePlayer player = subscriber2.player as BasePlayer;\n\t\t\t\tif (basePlayer.ShouldNetworkTo(player))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer.SendAsSnapshotWithChildren(player);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRust.Ai.SimpleAIMemory.RemoveIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.AddPlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerUnvanished\", basePlayer);\n\t}\n\targ.ReplyWith(\"Invis: \" + basePlayer.isInvisible);\n\tbasePlayer.Command(\"debug.setinvis_ui\", basePlayer.isInvisible);\n}\n",
      "ParametersText": "BasePlayer local0",
      "TargetName": "ConVar.Debugging",
      "MethodName": "invis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1457859582,
      "Name": "OnPlayerUnvanished",
      "FullName": "OnPlayerUnvanished [Patch]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerVar(Help = \"Make admin invisible\")]\npublic static void invis(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (basePlayer == null)\n\t{\n\t\treturn;\n\t}\n\tbool @bool = arg.GetBool(0, !basePlayer.isInvisible);\n\tif (@bool && !basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerVanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (Network.Connection subscriber in basePlayer.net.group.subscribers)\n\t\t{\n\t\t\tBasePlayer basePlayer2 = subscriber.player as BasePlayer;\n\t\t\tif (subscriber != basePlayer.net.connection && basePlayer.ShouldNetworkTo(basePlayer2) && !basePlayer2.IsSpectating())\n\t\t\t{\n\t\t\t\tbasePlayer.DestroyOnClient(subscriber);\n\t\t\t}\n\t\t}\n\t\tif (ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tbasePlayer.OcclusionMakeSubscribersForget();\n\t\t}\n\t\tbasePlayer.isInvisible = true;\n\t\tBasePlayer.invisPlayers.Add(basePlayer);\n\t\tbasePlayer.DisablePlayerCollider();\n\t\tRust.Ai.SimpleAIMemory.AddIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerVanished\", basePlayer);\n\t}\n\telse if (!@bool && basePlayer.isInvisible)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerUnvanish\", basePlayer) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbasePlayer.isInvisible = false;\n\t\tBasePlayer.invisPlayers.Remove(basePlayer);\n\t\tbasePlayer.EnablePlayerCollider();\n\t\tif (!ServerOcclusion.OcclusionEnabled)\n\t\t{\n\t\t\tforeach (Network.Connection subscriber2 in basePlayer.net.group.subscribers)\n\t\t\t{\n\t\t\t\tBasePlayer player = subscriber2.player as BasePlayer;\n\t\t\t\tif (basePlayer.ShouldNetworkTo(player))\n\t\t\t\t{\n\t\t\t\t\tbasePlayer.SendAsSnapshotWithChildren(player);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tRust.Ai.SimpleAIMemory.RemoveIgnorePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.RemovePlayer(basePlayer);\n\t\tBaseEntity.Query.Server.AddPlayer(basePlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnPlayerUnvanished\", basePlayer);\n\t}\n\targ.ReplyWith(\"Invis: \" + basePlayer.isInvisible);\n\tbasePlayer.Command(\"debug.setinvis_ui\", basePlayer.isInvisible);\n}\n",
      "ParametersText": "",
      "TargetName": "ConVar.Debugging",
      "MethodName": "invis",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1371113424,
      "Name": "OnFeedbackReported",
      "FullName": "OnFeedbackReported",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "Facepunch.Models.ReportType",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a feedback is reported."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "BasePlayer local1, string local2, string local3, Facepunch.Models.ReportType local5",
      "TargetName": "BasePlayer/<OnFeedbackReport>d__708",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1491190051,
      "Name": "OnPlayerReported",
      "FullName": "OnPlayerReported",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local6",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "basePlayer+<OnPlayerReported>d__707",
          "typeName": "BasePlayer+<OnPlayerReported>d__707",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player is reported."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "BasePlayer local1, string local6, BasePlayer.<OnPlayerReported>d__707 basePlayer+<OnPlayerReported>d__707, string local2, string local3, string local5",
      "TargetName": "BasePlayer/<OnPlayerReported>d__707",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3680231641,
      "Name": "OnSteamInventoryUpdated",
      "FullName": "OnSteamInventoryUpdated",
      "Category": "Player",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "SteamInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a steam inventory is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "SteamInventory local1",
      "TargetName": "SteamInventory/<UpdateSteamInventory>d__3",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3558041076,
      "Name": "OnSignalBroadcast",
      "FullName": "OnSignalBroadcast",
      "Category": "Player",
      "Parameters": [
        {
          "name": "baseEntity",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "sourceConnection",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "signal",
          "typeName": "BaseEntity+Signal",
          "optional": false
        },
        {
          "name": "arg",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when signal broadcast occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SignalBroadcast(BaseEntity.Signal signal, string arg, Network.Connection sourceConnection = null)\n{\n\tif (net != null && net.group != null && !base.limitNetworking && Oxide.Core.Interface.CallHook(\"OnSignalBroadcast\", this, sourceConnection, signal, arg) == null)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"SignalFromServerEx\", this, Network.SendMethod.Unreliable, Network.Priority.Immediate), (int)signal, arg, sourceConnection?.userid ?? 0);\n\t}\n}\n",
      "ParametersText": "BaseEntity baseEntity, Network.Connection sourceConnection, BaseEntity.Signal signal, string arg",
      "TargetName": "BaseEntity",
      "MethodName": "SignalBroadcast",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2917022116,
      "Name": "OnPlayerAddModifiers",
      "FullName": "OnPlayerAddModifiers",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when player add modifiers occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DoAction(Item item, BasePlayer player)\n{\n\tif (item.amount < 1)\n\t{\n\t\treturn;\n\t}\n\tGameObjectRef gameObjectRef = GetConsumeEffect();\n\tif (gameObjectRef.isValid)\n\t{\n\t\tUnityEngine.Vector3 posLocal = (player.IsDucked() ? new UnityEngine.Vector3(0f, 1f, 0f) : new UnityEngine.Vector3(0f, 2f, 0f));\n\t\tEffect.server.Run(gameObjectRef.resourcePath, player, 0u, posLocal, UnityEngine.Vector3.zero);\n\t}\n\tplayer.metabolism.MarkConsumption();\n\tItemModConsumable consumable = GetConsumable();\n\tif (!string.IsNullOrEmpty(consumable.achievementWhenEaten))\n\t{\n\t\tplayer.GiveAchievement(consumable.achievementWhenEaten);\n\t}\n\tif (!string.IsNullOrEmpty(consumable.steamStatIncrementWhenEaten))\n\t{\n\t\tplayer.stats.Add(consumable.steamStatIncrementWhenEaten, 1);\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnConsumableUsed(player, item);\n\tfloat num = UnityEngine.Mathf.Max(consumable.amountToConsume, 1);\n\tfloat num2 = UnityEngine.Mathf.Min(item.amount, num);\n\tfloat num3 = num2 / num;\n\tfloat num4 = item.conditionNormalized;\n\tif (consumable.conditionFractionToLose > 0f)\n\t{\n\t\tnum4 = consumable.conditionFractionToLose;\n\t}\n\tforeach (ItemModConsumable.ConsumableEffect effect in consumable.effects)\n\t{\n\t\tif (UnityEngine.Mathf.Clamp01(player.healthFraction + player.metabolism.pending_health.Fraction()) > effect.onlyIfHealthLessThan)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (effect.type == MetabolismAttribute.Type.Health)\n\t\t{\n\t\t\tif (effect.amount < 0f)\n\t\t\t{\n\t\t\t\tplayer.OnAttacked(new HitInfo(player, player, Rust.DamageType.Generic, (0f - effect.amount) * num3 * num4, player.transform.position + player.transform.forward * 1f));\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tplayer.health += effect.amount * num3 * num4;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tplayer.metabolism.ApplyChange(effect.type, effect.amount * num3 * num4, effect.time * num3 * num4);\n\t\t}\n\t}\n\tplayer.ProcessMissionEvent(BaseMission.MissionEventType.CONSUME, item.info.itemid, 1f);\n\tif (player.modifiers != null && Oxide.Core.Interface.CallHook(\"OnPlayerAddModifiers\", player, item, consumable) == null)\n\t{\n\t\tplayer.modifiers.Add(consumable.modifiers);\n\t}\n\tif (product != null)\n\t{\n\t\tItemAmountRandom[] array = product;\n\t\tforeach (ItemAmountRandom itemAmountRandom in array)\n\t\t{\n\t\t\tint num5 = UnityEngine.Mathf.RoundToInt((float)itemAmountRandom.RandomAmount() * num4);\n\t\t\tif (num5 > 0)\n\t\t\t{\n\t\t\t\tItem item2 = ItemManager.Create(itemAmountRandom.itemDef, num5, 0uL);\n\t\t\t\tplayer.GiveItem(item2);\n\t\t\t}\n\t\t}\n\t}\n\tif (string.IsNullOrEmpty(eatGesture))\n\t{\n\t\tplayer.SignalBroadcast(BaseEntity.Signal.Gesture, eatGesture);\n\t}\n\tif (consumable.conditionFractionToLose > 0f)\n\t{\n\t\titem.LoseCondition(consumable.conditionFractionToLose * item.maxCondition);\n\t}\n\telse\n\t{\n\t\titem.UseItem((int)num2);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ItemModConsume",
      "MethodName": "DoAction",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2731882747,
      "Name": "OnCentralizedBanCheck",
      "FullName": "OnCentralizedBanCheck",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when centralized ban check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "Auth_CentralizedBans/<Run>d__0",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1627232611,
      "Name": "CanLootEntity",
      "FullName": "CanLootEntity [IndustrialCrafter]",
      "Category": "Player",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to loot entity.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool PlayerOpenLoot(BasePlayer player, string panelToOpen = \"\", bool doPositionChecks = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanLootEntity\", player, this) != null)\n\t{\n\t\treturn false;\n\t}\n\tif (NeedsBuildingPrivilegeToUse && !player.CanBuild())\n\t{\n\t\treturn false;\n\t}\n\tif (OnlyOneUser && IsOpen())\n\t{\n\t\tplayer.ChatMessage(\"Already in use\");\n\t\treturn false;\n\t}\n\tif (player.inventory.loot.StartLootingEntity(this, doPositionChecks))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Open, b: true);\n\t\tplayer.inventory.loot.AddContainer(_inventory);\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tplayer.ClientRPC(RpcTarget.Player(\"RPC_OpenLootPanel\", player), LootPanelName);\n\t\tSendNetworkUpdate();\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "IndustrialCrafter",
      "MethodName": "PlayerOpenLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3223344789,
      "Name": "OnClientDisconnected",
      "FullName": "OnClientDisconnected",
      "Category": "Player",
      "Parameters": [
        {
          "name": "cn",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "strReason",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a client disconnects."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected void OnDisconnected(string strReason, Network.Connection cn)\n{\n\tif (cn != null)\n\t{\n\t\tRecordDisconnection(cn);\n\t\tcn.connected = false;\n\t\tcn.active = false;\n\t\tif (callbackHandler != null)\n\t\t{\n\t\t\tcallbackHandler.OnDisconnected(strReason, cn);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnClientDisconnected\", cn, strReason);\n\t\tRemoveConnection(cn);\n\t}\n}\n",
      "ParametersText": "Network.Connection cn, string strReason",
      "TargetName": "Network.Server",
      "MethodName": "OnDisconnected",
      "AssemblyName": "Facepunch.Network",
      "ReturnTypeName": "void"
    }
  ],
  "Server": [
    {
      "Id": 2535152661,
      "Name": "OnServerCommand",
      "FullName": "OnServerCommand",
      "Category": "Server",
      "Parameters": [
        {
          "name": "arg",
          "typeName": "ConsoleSystem+Arg",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnServerCommand(ConsoleSystem.Arg arg)\n{\n\tif (arg != null && arg.cmd != null && UnityEngine.ArgEx.Player(arg) != null && arg.cmd.FullName == \"chat.say\")\n\t{\n\t\treturn null;\n\t}\n\treturn (Carbon.HookCaller.CallStaticHook(2535152661u, arg) != null) ? Carbon.Cache.True : null;\n}\n",
      "ParametersText": "ConsoleSystem.Arg arg",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnServerCommand",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 352240293,
      "Name": "OnServerInitialized",
      "FullName": "OnServerInitialized [1]",
      "Category": "Server",
      "Parameters": [
        {
          "name": "initialized",
          "typeName": "System.Boolean",
          "optional": true
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when the server finishes initializing networking and game services.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OpenConnection(bool useSteamServer = true)\n{\n\tif (ConVar.Server.queryport <= 0 || ConVar.Server.queryport == ConVar.Server.port)\n\t{\n\t\tConVar.Server.queryport = System.Math.Max(ConVar.Server.port, Facepunch.RCon.Port) + 1;\n\t}\n\tNetwork.Net.sv.ip = ConVar.Server.ip;\n\tNetwork.Net.sv.port = ConVar.Server.port;\n\tNetwork.Net.sv.encryption = ConVar.Server.encryption;\n\tint num = Facepunch.Application.Manifest?.Features?.MinimumSecureEncryption ?? 2;\n\tif (Facepunch.CommandLine.HasSwitch(\"-insecure\"))\n\t{\n\t\tNetwork.Net.sv.secure = false;\n\t\tNetwork.Net.sv.encryption = UnityEngine.Mathf.Clamp(ConVar.Server.encryption, 0, 1);\n\t}\n\tif (Network.Net.sv.secure && Network.Net.sv.encryption < num)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"A server requires a minimum 'encryption' value of {num} to be secure and visible in the server browser. To remain secure, increase your 'encryption' convar to {num} and restart your server.\");\n\t\tNetwork.Net.sv.secure = false;\n\t}\n\tif (useSteamServer)\n\t{\n\t\tStartSteamServer();\n\t}\n\telse\n\t{\n\t\tPlatformService.Instance.Initialize(RustPlatformHooks.Instance);\n\t}\n\tif (!Network.Net.sv.Start(this))\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Couldn't Start Server.\");\n\t\tCloseConnection();\n\t\treturn;\n\t}\n\tNetwork.Net.sv.cryptography = new NetworkCryptographyServer();\n\tEACServer.DoStartup();\n\tInvokeRepeating(\"DoTick\", 1f, 1f / (float)ConVar.Server.tickrate);\n\tInvokeRepeating(\"DoHeartbeat\", 1f, 1f);\n\trunFrameUpdate = true;\n\tConsoleSystem.OnReplicatedVarChanged += OnReplicatedVarChanged;\n\tOxide.Core.Interface.CallHook(\"IOnServerInitialized\");\n}\n",
      "ParametersText": "bool initialized = default",
      "TargetName": "ServerMgr",
      "MethodName": "OpenConnection",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2414711472,
      "Name": "OnServerShutdown",
      "FullName": "OnServerShutdown",
      "Category": "Server",
      "Parameters": [],
      "Flags": 16,
      "Descriptions": [
        "Called when server shutdown occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal static object IOnServerShutdown()\n{\n\tCarbon.Logger.Log(\"Saving plugin configuration and data..\");\n\tSystem.Collections.Generic.List<Carbon.Base.BaseHookable> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Carbon.Base.BaseHookable>>();\n\tobj.AddRange(Carbon.Community.Runtime.ModuleProcessor.Modules);\n\tforeach (Carbon.Base.BaseHookable item in obj)\n\t{\n\t\tif (item is Carbon.Base.BaseModule baseModule)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tbaseModule.Shutdown();\n\t\t\t}\n\t\t\tcatch (System.Exception ex)\n\t\t\t{\n\t\t\t\tCarbon.Logger.Error($\"Failed shutting down module '{baseModule.Name} v{baseModule.Version}'\", ex);\n\t\t\t}\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\tCarbon.HookCaller.CallStaticHook(2414711472u);\n\tCarbon.HookCaller.CallStaticHook(2396958305u);\n\tCarbon.Logger.Log(\"Shutting down Carbon..\");\n\tOxide.Core.Interface.Oxide.OnShutdown();\n\tCarbon.WebControlPanel.Shutdown();\n\tusing PooledList<Oxide.Plugins.RustPlugin> pooledList = Facepunch.Pool.Get<PooledList<Oxide.Plugins.RustPlugin>>();\n\tCarbon.Core.ModLoader.Packages.GetAllHookables(pooledList);\n\tforeach (Oxide.Plugins.RustPlugin item2 in pooledList)\n\t{\n\t\tOxide.Core.Plugins.Plugin[] requires = item2.Requires;\n\t\tif (requires == null || requires.Length <= 0)\n\t\t{\n\t\t\tCarbon.Core.ModLoader.UninitializePlugin(item2);\n\t\t}\n\t}\n\treturn null;\n}\n",
      "ParametersText": "",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnServerShutdown",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2759983490,
      "Name": "InitLogging",
      "FullName": "InitLogging",
      "Category": "Server",
      "Parameters": [],
      "Flags": 5,
      "Descriptions": [
        "Called when a nit is logging."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void StartupShared()\n{\n\tOxide.Core.Interface.CallHook(\"InitLogging\");\n\tItemManager.Initialize();\n}\n",
      "ParametersText": "",
      "TargetName": "Bootstrap",
      "MethodName": "StartupShared",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1216670645,
      "Name": "OnTick",
      "FullName": "OnTick",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void DoTick()\n{\n\tOxide.Core.Interface.CallHook(\"OnTick\");\n\tFacepunch.RCon.Update();\n\tCompanionServer.Server.Update();\n\tNexusServer.Update();\n\tfor (int i = 0; i < Network.Net.sv.connections.Count; i++)\n\t{\n\t\tNetwork.Connection connection = Network.Net.sv.connections[i];\n\t\tif (!connection.isAuthenticated && !(connection.GetSecondsConnected() < (float)ConVar.Server.authtimeout))\n\t\t{\n\t\t\tNetwork.Net.sv.Kick(connection, \"Authentication Timed Out\");\n\t\t}\n\t}\n\tfloat num = UnityEngine.Mathf.Max(ConVar.Server.premiumRecheckInterval, 60f);\n\tif (ConVar.Server.premium && (double)sinceLastPremiumRecheck > (double)num)\n\t{\n\t\tsinceLastPremiumRecheck = 0.0;\n\t\tRecheckPremiumStatus();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ServerMgr",
      "MethodName": "DoTick",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3248723167,
      "Name": "OnServerInitialize",
      "FullName": "OnServerInitialize",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a server initializes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool Initialize(bool loadSave = true, string saveFile = \"\", bool allowOutOfDateSaves = false, bool skipInitialSpawn = false)\n{\n\tOxide.Core.Interface.CallHook(\"OnServerInitialize\");\n\tpersistance = new UserPersistance(ConVar.Server.rootFolder);\n\tplayerStateManager = new PlayerStateManager(persistance);\n\tTutorialIsland.GenerateIslandSpawnPoints(loadingSave: true);\n\tBasePlayer.InitInternalState();\n\tTriggerParent.InitInternalState();\n\tif ((bool)SingletonComponent<SpawnHandler>.Instance)\n\t{\n\t\tusing (TimeWarning.New(\"SpawnHandler.UpdateDistributions\"))\n\t\t{\n\t\t\tSingletonComponent<SpawnHandler>.Instance.UpdateDistributions();\n\t\t}\n\t}\n\tif (loadSave)\n\t{\n\t\tWorld.LoadedFromSave = true;\n\t\tWorld.LoadedFromSave = (skipInitialSpawn = SaveRestore.Load(saveFile, allowOutOfDateSaves));\n\t}\n\telse\n\t{\n\t\tSaveRestore.SaveCreatedTime = System.DateTime.UtcNow;\n\t\tWorld.LoadedFromSave = false;\n\t}\n\tif (!World.LoadedFromSave)\n\t{\n\t\tSaveRestore.SpawnMapEntities(SaveRestore.FindMapEntities());\n\t}\n\tSaveRestore.InitializeWipeId();\n\tNetwork.Relay.RustRelay.RelayWipeId = SaveRestore.WipeId;\n\tif ((bool)SingletonComponent<SpawnHandler>.Instance)\n\t{\n\t\tif (!skipInitialSpawn)\n\t\t{\n\t\t\tusing (TimeWarning.New(\"SpawnHandler.InitialSpawn\", 200))\n\t\t\t{\n\t\t\t\tSingletonComponent<SpawnHandler>.Instance.InitialSpawn();\n\t\t\t}\n\t\t}\n\t\tusing (TimeWarning.New(\"SpawnHandler.StartSpawnTick\", 200))\n\t\t{\n\t\t\tSingletonComponent<SpawnHandler>.Instance.StartSpawnTick();\n\t\t}\n\t}\n\tCreateImportantEntities();\n\tauth = GetComponent<ConnectionAuth>();\n\tFacepunch.Rust.Analytics.StartForServer();\n\tUnityEngine.Debug.Log(\"Relay Enabled: \" + Network.Relay.RustRelay.Config.Enabled);\n\tSystem.Collections.Generic.Dictionary<uint, string> dictionary = System.Linq.Enumerable.ToDictionary(System.Linq.Enumerable.Where(GameManifest.Current.prefabProperties, (GameManifest.PrefabProperties p) => p != null && !string.IsNullOrWhiteSpace(p.name)), (GameManifest.PrefabProperties p) => p.hash, (GameManifest.PrefabProperties p) => p.name);\n\tSystem.Collections.Generic.Dictionary<uint, string> dictionary2 = System.Linq.Enumerable.ToDictionary(GameManifest.Current.pooledStrings, (GameManifest.PooledString x) => x.hash, (GameManifest.PooledString x) => x.str);\n\tNetwork.Relay.RustRelay.SetCachedManifest(dictionary);\n\tNetwork.Relay.RustRelay.SetCachedStringPool(dictionary2);\n\tNetwork.Relay.RustRelay.SetCachedMapSnapshot(World.MapFolderName, World.MapFileName);\n\tNetwork.Relay.RustRelay.SetCachedSnapshot(ConVar.Server.rootFolder, World.SaveFileName);\n\tNetwork.Relay.RustRelay.ForceSave = () => SaveRestore.Save(AndWait: true);\n\tif (Network.Relay.RustRelay.Config.Enabled)\n\t{\n\t\tif (!World.LoadedFromSave)\n\t\t{\n\t\t\tSaveRestore.Save(AndWait: true);\n\t\t}\n\t\tUnityEngine.Debug.Log(\"[Rust Relay] Uploading initial server state\");\n\t\tSystem.Threading.Tasks.Task.WaitAll(Network.Relay.RustRelay.UploadManifestToRelayAsync(dictionary), Network.Relay.RustRelay.UploadStringPoolToRelayAsync(dictionary2), Network.Relay.RustRelay.UploadMapSnapshotAsync(World.MapFolderName, World.MapFileName), Network.Relay.RustRelay.UploadSnapshotAsync(ConVar.Server.rootFolder, World.SaveFileName));\n\t\tUnityEngine.Debug.Log(\"[Rust Relay] Initial server state uploaded\");\n\t}\n\treturn World.LoadedFromSave;\n}\n",
      "ParametersText": "",
      "TargetName": "ServerMgr",
      "MethodName": "Initialize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1183644224,
      "Name": "OnServerRestartInterrupt",
      "FullName": "OnServerRestartInterrupt",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when server restart interrupt occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RestartServer(string strNotice, int iSeconds)\n{\n\tif (SingletonComponent<ServerMgr>.Instance == null)\n\t{\n\t\treturn;\n\t}\n\tif (SingletonComponent<ServerMgr>.Instance.restartCoroutine != null)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnServerRestartInterrupt\") != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tShowToastToAllClients(GameTip.Styles.Server_Event, RESTART_INTERRUPTED_PHRASE, false);\n\t\tSingletonComponent<ServerMgr>.Instance.StopCoroutine(SingletonComponent<ServerMgr>.Instance.restartCoroutine);\n\t\tSingletonComponent<ServerMgr>.Instance.restartCoroutine = null;\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnServerRestart\", strNotice, iSeconds) == null)\n\t{\n\t\tSingletonComponent<ServerMgr>.Instance.restartCoroutine = SingletonComponent<ServerMgr>.Instance.ServerRestartWarning(strNotice, iSeconds);\n\t\tSingletonComponent<ServerMgr>.Instance.StartCoroutine(SingletonComponent<ServerMgr>.Instance.restartCoroutine);\n\t\tSingletonComponent<ServerMgr>.Instance.UpdateServerInformation();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ServerMgr",
      "MethodName": "RestartServer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3716566533,
      "Name": "OnServerRestart",
      "FullName": "OnServerRestart",
      "Category": "Server",
      "Parameters": [
        {
          "name": "strNotice",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "iSeconds",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when server restart occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RestartServer(string strNotice, int iSeconds)\n{\n\tif (SingletonComponent<ServerMgr>.Instance == null)\n\t{\n\t\treturn;\n\t}\n\tif (SingletonComponent<ServerMgr>.Instance.restartCoroutine != null)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnServerRestartInterrupt\") != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tShowToastToAllClients(GameTip.Styles.Server_Event, RESTART_INTERRUPTED_PHRASE, false);\n\t\tSingletonComponent<ServerMgr>.Instance.StopCoroutine(SingletonComponent<ServerMgr>.Instance.restartCoroutine);\n\t\tSingletonComponent<ServerMgr>.Instance.restartCoroutine = null;\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnServerRestart\", strNotice, iSeconds) == null)\n\t{\n\t\tSingletonComponent<ServerMgr>.Instance.restartCoroutine = SingletonComponent<ServerMgr>.Instance.ServerRestartWarning(strNotice, iSeconds);\n\t\tSingletonComponent<ServerMgr>.Instance.StartCoroutine(SingletonComponent<ServerMgr>.Instance.restartCoroutine);\n\t\tSingletonComponent<ServerMgr>.Instance.UpdateServerInformation();\n\t}\n}\n",
      "ParametersText": "string strNotice, int iSeconds",
      "TargetName": "ServerMgr",
      "MethodName": "RestartServer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4109979236,
      "Name": "OnServerInformationUpdated",
      "FullName": "OnServerInformationUpdated",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called after server information and Steam keys are updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void UpdateServerInformation()\n{\n\tif (!SteamServer.IsValid)\n\t{\n\t\treturn;\n\t}\n\tusing (TimeWarning.New(\"UpdateServerInformation\"))\n\t{\n\t\tSteamServer.ServerName = ConVar.Server.hostname;\n\t\tSteamServer.MaxPlayers = ConVar.Server.maxplayers;\n\t\tSteamServer.Passworded = false;\n\t\tSteamServer.MapName = World.GetServerBrowserMapName();\n\t\tstring text = \"stok\";\n\t\tif (Restarting)\n\t\t{\n\t\t\ttext = \"strst\";\n\t\t}\n\t\tstring text2 = $\"born{Facepunch.Math.Epoch.FromDateTime(SaveRestore.SaveCreatedTime)}\";\n\t\tstring text3 = $\"gm{GamemodeName()}\";\n\t\tif (text3 != \"gmrust\" && text3 != \"gmvanilla\")\n\t\t{\n\t\t\tConVar.Server.tags = ConVar.Server.tags.Replace(\"vanilla\", \"\");\n\t\t}\n\t\tstring text4 = (ConVar.Server.pve ? \",pve\" : string.Empty);\n\t\tstring text5 = ConVar.Server.tags?.Trim(',') ?? \"\";\n\t\tstring text6 = ((!string.IsNullOrWhiteSpace(text5)) ? (\",\" + text5) : \"\");\n\t\tstring text7 = Facepunch.BuildInfo.Current?.Scm?.ChangeId ?? \"0\";\n\t\tstring text8 = (ConVar.Server.premium ? \",premium\" : \"\");\n\t\tstring text9 = _systemConfigTag.Get((ConVar.Server.useServerWideRequiredSystemConfig, ConVar.Server.usePerPlayerRequiredSystemConfig));\n\t\tstring text10 = Facepunch.Ping.PingEstimater.GetCachedClosestRegion().Code;\n\t\tif (!string.IsNullOrEmpty(ConVar.Server.ping_region_code_override))\n\t\t{\n\t\t\ttext10 = ConVar.Server.ping_region_code_override;\n\t\t}\n\t\tSteamServer.GameTags = ServerTagCompressor.CompressTags($\"mp{ConVar.Server.maxplayers},cp{BasePlayer.activePlayerList.Count},pt{Network.Net.sv.ProtocolId},qp{SingletonComponent<ServerMgr>.Instance.connectionQueue.Queued},$r{text10},v{2625}{text4}{text6},{text2},{text3},cs{text7}{text8}{text9},ts{RelationshipManager.maxTeamSize}\");\n\t\tif (ConVar.Server.description != null && ConVar.Server.description.Length > 100)\n\t\t{\n\t\t\tstring[] array = System.Linq.Enumerable.ToArray(UnityEngine.StringEx.SplitToChunks(ConVar.Server.description, 100));\n\t\t\tfor (int i = 0; i < 16; i++)\n\t\t\t{\n\t\t\t\tif (i < array.Length)\n\t\t\t\t{\n\t\t\t\t\tSteamServer.SetKey($\"description_{i:00}\", array[i]);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tSteamServer.SetKey($\"description_{i:00}\", string.Empty);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSteamServer.SetKey(\"description_0\", ConVar.Server.description);\n\t\t\tfor (int j = 1; j < 16; j++)\n\t\t\t{\n\t\t\t\tSteamServer.SetKey($\"description_{j:00}\", string.Empty);\n\t\t\t}\n\t\t}\n\t\tSteamServer.SetKey(\"hash\", AssemblyHash);\n\t\tSteamServer.SetKey(\"status\", text);\n\t\tstring text11 = World.Seed.ToString();\n\t\tif (!ConVar.Server.mapenabled || ConVar.Server.fogofwar)\n\t\t{\n\t\t\ttext11 = \"0\";\n\t\t}\n\t\tSteamServer.SetKey(\"world.seed\", text11);\n\t\tSteamServer.SetKey(\"world.size\", World.Size.ToString());\n\t\tSteamServer.SetKey(\"pve\", ConVar.Server.pve.ToString());\n\t\tSteamServer.SetKey(\"headerimage\", ConVar.Server.headerimage);\n\t\tSteamServer.SetKey(\"logoimage\", ConVar.Server.logoimage);\n\t\tSteamServer.SetKey(\"url\", ConVar.Server.url);\n\t\tSteamServer.SetKey(\"map_image_url\", MapUploader.ImageUrl);\n\t\tSteamServer.SetKey(\"level_url\", ConVar.Server.levelurl);\n\t\tif (!string.IsNullOrWhiteSpace(ConVar.Server.favoritesEndpoint))\n\t\t{\n\t\t\tSteamServer.SetKey(\"favendpoint\", ConVar.Server.favoritesEndpoint);\n\t\t}\n\t\tSteamServer.SetKey(\"gmn\", GamemodeName());\n\t\tSteamServer.SetKey(\"gmt\", GamemodeTitle());\n\t\tSteamServer.SetKey(\"uptime\", ((int)UnityEngine.Time.realtimeSinceStartup).ToString());\n\t\tSteamServer.SetKey(\"gc_mb\", Performance.report.memoryAllocations.ToString());\n\t\tSteamServer.SetKey(\"gc_cl\", Performance.report.memoryCollections.ToString());\n\t\tSteamServer.SetKey(\"ram_sys\", (Performance.report.memoryUsageSystem / 1000000).ToString());\n\t\tSteamServer.SetKey(\"fps\", Performance.report.frameRate.ToString());\n\t\tSteamServer.SetKey(\"fps_avg\", Performance.report.frameRateAverage.ToString(\"0.00\"));\n\t\tSteamServer.SetKey(\"ent_cnt\", BaseNetworkable.serverEntities.Count.ToString());\n\t\tSteamServer.SetKey(\"build\", Facepunch.BuildInfo.Current.Scm.ChangeId);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnServerInformationUpdated\");\n}\n",
      "ParametersText": "",
      "TargetName": "ServerMgr",
      "MethodName": "UpdateServerInformation",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1279972524,
      "Name": "OnMessagePlayer",
      "FullName": "OnMessagePlayer",
      "Category": "Server",
      "Parameters": [
        {
          "name": "msg",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ChatMessage(string msg)\n{\n\tif (base.isServer && Oxide.Core.Interface.CallHook(\"OnMessagePlayer\", msg, this) == null)\n\t{\n\t\tSendConsoleCommand(\"chat.add\", 2, 0, msg);\n\t}\n}\n",
      "ParametersText": "string msg, BasePlayer basePlayer",
      "TargetName": "BasePlayer",
      "MethodName": "ChatMessage",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3155060134,
      "Name": "OnServerMessage",
      "FullName": "OnServerMessage",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a server is received."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void Broadcast(string message, string username = \"SERVER\", string color = \"#eee\", ulong userid = 0uL)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnServerMessage\", message, username, color, userid) == null)\n\t{\n\t\tstring text = UnityEngine.StringEx.EscapeRichText(username);\n\t\tConsoleNetwork.BroadcastToAllClients(\"chat.add\", 2, 0, \"<color=\" + color + \">\" + text + \"</color> \" + message);\n\t\tConVar.Chat.ChatEntry ce = default(ConVar.Chat.ChatEntry);\n\t\tce.Channel = ConVar.Chat.ChatChannel.Server;\n\t\tce.Message = message;\n\t\tce.UserId = userid.ToString();\n\t\tce.Username = username;\n\t\tce.Color = color;\n\t\tce.Time = Facepunch.Math.Epoch.Current;\n\t\tRecord(ce);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ConVar.Chat",
      "MethodName": "Broadcast",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3983888645,
      "Name": "OnRconConnection",
      "FullName": "OnRconConnection [exp]",
      "Category": "Server",
      "Parameters": [
        {
          "name": "address",
          "typeName": "System.Net.IPAddress",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when rcon connection occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "System.Net.IPAddress address",
      "TargetName": "Facepunch.RCon/RConListener",
      "MethodName": "ProcessConnections",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2815160424,
      "Name": "OnNewSave",
      "FullName": "OnNewSave",
      "Category": "Server",
      "Parameters": [
        {
          "name": "strFilename",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic static bool Load(string strFilename = \"\", bool allowOutOfDateSaves = false)\n{\n\tSaveCreatedTime = System.DateTime.UtcNow;\n\ttry\n\t{\n\t\tif (strFilename == \"\")\n\t\t{\n\t\t\tstrFilename = World.SaveFolderName + \"/\" + World.SaveFileName;\n\t\t}\n\t\tif (!System.IO.File.Exists(strFilename))\n\t\t{\n\t\t\tOxide.Core.Interface.CallHook(\"OnNewSave\", strFilename);\n\t\t\tif (!System.IO.File.Exists(\"TestSaves/\" + strFilename))\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning(\"Couldn't load \" + strFilename + \" - file doesn't exist\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tstrFilename = \"TestSaves/\" + strFilename;\n\t\t}\n\t\tSystem.Collections.Generic.List<BaseEntity> list = FindMapEntities();\n\t\tSystem.Collections.Generic.Dictionary<BaseEntity, ProtoBuf.Entity> dictionary = new System.Collections.Generic.Dictionary<BaseEntity, ProtoBuf.Entity>();\n\t\tusing (System.IO.FileStream fileStream = System.IO.File.OpenRead(strFilename))\n\t\t{\n\t\t\tusing System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fileStream);\n\t\t\tSaveCreatedTime = System.IO.File.GetCreationTime(strFilename);\n\t\t\tif (binaryReader.ReadSByte() != 83 || binaryReader.ReadSByte() != 65 || binaryReader.ReadSByte() != 86 || binaryReader.ReadSByte() != 82)\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning(\"Invalid save (missing header)\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (binaryReader.PeekChar() == 74)\n\t\t\t{\n\t\t\t\tbinaryReader.ReadChar();\n\t\t\t\tWipeId = JsonConvert.DeserializeObject<SaveRestore.SaveExtraData>(binaryReader.ReadString()).WipeId;\n\t\t\t}\n\t\t\tif (binaryReader.PeekChar() == 68)\n\t\t\t{\n\t\t\t\tbinaryReader.ReadChar();\n\t\t\t\tSaveCreatedTime = Facepunch.Math.Epoch.ToDateTime(binaryReader.ReadInt32());\n\t\t\t}\n\t\t\tif (binaryReader.ReadUInt32() != 284)\n\t\t\t{\n\t\t\t\tif (allowOutOfDateSaves)\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"This save is from an older (possibly incompatible) version!\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"This save is from an older version. It might not load properly.\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tClearMapEntities(list);\n\t\t\tUnityEngine.Assertions.Assert.IsTrue(BaseEntity.saveList.Count == 0, \"BaseEntity.saveList isn't empty!\");\n\t\t\tNetwork.Net.sv.Reset();\n\t\t\tRust.Application.isLoadingSave = true;\n\t\t\tSystem.Collections.Generic.HashSet<NetworkableId> hashSet = new System.Collections.Generic.HashSet<NetworkableId>();\n\t\t\tusing PooledList<ulong> pooledList = Facepunch.Pool.Get<PooledList<ulong>>();\n\t\t\twhile (fileStream.Position < fileStream.Length)\n\t\t\t{\n\t\t\t\tFacepunch.RCon.Update();\n\t\t\t\tuint num = binaryReader.ReadUInt32();\n\t\t\t\tlong position = fileStream.Position;\n\t\t\t\tProtoBuf.Entity entData = Facepunch.Pool.Get<ProtoBuf.Entity>();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tentData.ReadFromStream(fileStream, (int)num);\n\t\t\t\t}\n\t\t\t\tcatch (System.Exception exception)\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"Skipping entity since it could not be deserialized - stream position: \" + position + \" size: \" + num);\n\t\t\t\t\tUnityEngine.Debug.LogException(exception);\n\t\t\t\t\tfileStream.Position = position + num;\n\t\t\t\t\tentData.Dispose();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entData.baseNetworkable.uid.IsValid && hashSet.Contains(entData.baseNetworkable.uid))\n\t\t\t\t{\n\t\t\t\t\tstring[] obj = new string[5] { \"Skipping entity \", null, null, null, null };\n\t\t\t\t\tNetworkableId uid = entData.baseNetworkable.uid;\n\t\t\t\t\tobj[1] = uid.ToString();\n\t\t\t\t\tobj[2] = \" \";\n\t\t\t\t\tobj[3] = StringPool.Get(entData.baseNetworkable.prefabID);\n\t\t\t\t\tobj[4] = \" - uid is used multiple times\";\n\t\t\t\t\tUnityEngine.Debug.LogWarning(string.Concat(obj));\n\t\t\t\t\tentData.Dispose();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entData.basePlayer != null)\n\t\t\t\t{\n\t\t\t\t\tif (System.Linq.Enumerable.Any(dictionary, (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> x) => x.Value.basePlayer != null && x.Value.basePlayer.userid == entData.basePlayer.userid))\n\t\t\t\t\t{\n\t\t\t\t\t\tUnityEngine.Debug.LogWarning($\"Skipping entity {entData.baseNetworkable.uid} - it's a player {entData.basePlayer.userid} who is in the save multiple times\");\n\t\t\t\t\t\tentData.Dispose();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (BasePlayer.IsBotId(entData.basePlayer.userid))\n\t\t\t\t\t{\n\t\t\t\t\t\tpooledList.Add(entData.basePlayer.userid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (entData.baseNetworkable.uid.IsValid)\n\t\t\t\t{\n\t\t\t\t\thashSet.Add(entData.baseNetworkable.uid);\n\t\t\t\t}\n\t\t\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(StringPool.Get(entData.baseNetworkable.prefabID), entData.baseEntity.pos, UnityEngine.Quaternion.Euler(entData.baseEntity.rot));\n\t\t\t\tif ((bool)baseEntity)\n\t\t\t\t{\n\t\t\t\t\tbaseEntity.InitLoad(entData.baseNetworkable.uid);\n\t\t\t\t\tbaseEntity.PreServerLoad();\n\t\t\t\t\tdictionary.Add(baseEntity, entData);\n\t\t\t\t}\n\t\t\t}\n\t\t\tBasePlayer.ReserveBotIds(pooledList);\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"Spawning \" + list.Count + \" entities from map\");\n\t\tforeach (BaseEntity item in list)\n\t\t{\n\t\t\tif (!(item == null))\n\t\t\t{\n\t\t\t\titem.SpawnAsMapEntity();\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tUnityEngine.DebugEx.Log(\"Spawning \" + dictionary.Count + \" entities from save\");\n\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"OnSaveLoad\", dictionary);\n\t\tif (obj2 is bool)\n\t\t{\n\t\t\treturn (bool)obj2;\n\t\t}\n\t\tBaseNetworkable.LoadInfo info = default(BaseNetworkable.LoadInfo);\n\t\tinfo.fromDisk = true;\n\t\tSystem.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();\n\t\tint num2 = 0;\n\t\tforeach (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> item2 in dictionary)\n\t\t{\n\t\t\tBaseEntity key = item2.Key;\n\t\t\tif (key == null)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tFacepunch.RCon.Update();\n\t\t\tinfo.msg = item2.Value;\n\t\t\tkey.Spawn();\n\t\t\tkey.Load(info);\n\t\t\tif (key.IsValid())\n\t\t\t{\n\t\t\t\tnum2++;\n\t\t\t\tif (stopwatch.Elapsed.TotalMilliseconds > 2000.0)\n\t\t\t\t{\n\t\t\t\t\tstopwatch.Reset();\n\t\t\t\t\tstopwatch.Start();\n\t\t\t\t\tUnityEngine.DebugEx.Log(\"\\t\" + num2 + \" / \" + dictionary.Count);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tUnityEngine.DebugEx.Log(\"Postprocessing \" + list.Count + \" entities from map\");\n\t\tforeach (BaseEntity item3 in list)\n\t\t{\n\t\t\tif (!(item3 == null))\n\t\t\t{\n\t\t\t\titem3.PostMapEntitySpawn();\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tUnityEngine.DebugEx.Log(\"Postprocessing \" + list.Count + \" entities from save\");\n\t\tforeach (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> item4 in dictionary)\n\t\t{\n\t\t\tBaseEntity key2 = item4.Key;\n\t\t\tif (!(key2 == null))\n\t\t\t{\n\t\t\t\tFacepunch.RCon.Update();\n\t\t\t\tif (key2.IsValid())\n\t\t\t\t{\n\t\t\t\t\tkey2.UpdateNetworkGroup();\n\t\t\t\t\tkey2.PostServerLoad();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tforeach (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> item5 in dictionary)\n\t\t{\n\t\t\t_ = item5.Value;\n\t\t\titem5.Value.Dispose();\n\t\t}\n\t\tdictionary.Clear();\n\t\tif ((bool)SingletonComponent<SpawnHandler>.Instance)\n\t\t{\n\t\t\tUnityEngine.DebugEx.Log(\"Enforcing SpawnPopulation Limits\");\n\t\t\tSingletonComponent<SpawnHandler>.Instance.EnforceLimits();\n\t\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\t}\n\t\tInitializeWipeId();\n\t\tRust.Application.isLoadingSave = false;\n\t\treturn true;\n\t}\n\tcatch (System.Exception exception2)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Error loading save (\" + strFilename + \")\");\n\t\tUnityEngine.Debug.LogException(exception2);\n\t\treturn false;\n\t}\n}\n",
      "ParametersText": "string strFilename",
      "TargetName": "SaveRestore",
      "MethodName": "Load",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 106238856,
      "Name": "OnSaveLoad",
      "FullName": "OnSaveLoad",
      "Category": "Server",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "System.Collections.Generic.Dictionary`2[BaseEntity,ProtoBuf.Entity]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remote RCON command is received.",
        "Provides access to the raw RCON message so you can log or modify behavior."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic static bool Load(string strFilename = \"\", bool allowOutOfDateSaves = false)\n{\n\tSaveCreatedTime = System.DateTime.UtcNow;\n\ttry\n\t{\n\t\tif (strFilename == \"\")\n\t\t{\n\t\t\tstrFilename = World.SaveFolderName + \"/\" + World.SaveFileName;\n\t\t}\n\t\tif (!System.IO.File.Exists(strFilename))\n\t\t{\n\t\t\tOxide.Core.Interface.CallHook(\"OnNewSave\", strFilename);\n\t\t\tif (!System.IO.File.Exists(\"TestSaves/\" + strFilename))\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning(\"Couldn't load \" + strFilename + \" - file doesn't exist\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tstrFilename = \"TestSaves/\" + strFilename;\n\t\t}\n\t\tSystem.Collections.Generic.List<BaseEntity> list = FindMapEntities();\n\t\tSystem.Collections.Generic.Dictionary<BaseEntity, ProtoBuf.Entity> dictionary = new System.Collections.Generic.Dictionary<BaseEntity, ProtoBuf.Entity>();\n\t\tusing (System.IO.FileStream fileStream = System.IO.File.OpenRead(strFilename))\n\t\t{\n\t\t\tusing System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(fileStream);\n\t\t\tSaveCreatedTime = System.IO.File.GetCreationTime(strFilename);\n\t\t\tif (binaryReader.ReadSByte() != 83 || binaryReader.ReadSByte() != 65 || binaryReader.ReadSByte() != 86 || binaryReader.ReadSByte() != 82)\n\t\t\t{\n\t\t\t\tUnityEngine.Debug.LogWarning(\"Invalid save (missing header)\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (binaryReader.PeekChar() == 74)\n\t\t\t{\n\t\t\t\tbinaryReader.ReadChar();\n\t\t\t\tWipeId = JsonConvert.DeserializeObject<SaveRestore.SaveExtraData>(binaryReader.ReadString()).WipeId;\n\t\t\t}\n\t\t\tif (binaryReader.PeekChar() == 68)\n\t\t\t{\n\t\t\t\tbinaryReader.ReadChar();\n\t\t\t\tSaveCreatedTime = Facepunch.Math.Epoch.ToDateTime(binaryReader.ReadInt32());\n\t\t\t}\n\t\t\tif (binaryReader.ReadUInt32() != 284)\n\t\t\t{\n\t\t\t\tif (allowOutOfDateSaves)\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"This save is from an older (possibly incompatible) version!\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"This save is from an older version. It might not load properly.\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tClearMapEntities(list);\n\t\t\tUnityEngine.Assertions.Assert.IsTrue(BaseEntity.saveList.Count == 0, \"BaseEntity.saveList isn't empty!\");\n\t\t\tNetwork.Net.sv.Reset();\n\t\t\tRust.Application.isLoadingSave = true;\n\t\t\tSystem.Collections.Generic.HashSet<NetworkableId> hashSet = new System.Collections.Generic.HashSet<NetworkableId>();\n\t\t\tusing PooledList<ulong> pooledList = Facepunch.Pool.Get<PooledList<ulong>>();\n\t\t\twhile (fileStream.Position < fileStream.Length)\n\t\t\t{\n\t\t\t\tFacepunch.RCon.Update();\n\t\t\t\tuint num = binaryReader.ReadUInt32();\n\t\t\t\tlong position = fileStream.Position;\n\t\t\t\tProtoBuf.Entity entData = Facepunch.Pool.Get<ProtoBuf.Entity>();\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tentData.ReadFromStream(fileStream, (int)num);\n\t\t\t\t}\n\t\t\t\tcatch (System.Exception exception)\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"Skipping entity since it could not be deserialized - stream position: \" + position + \" size: \" + num);\n\t\t\t\t\tUnityEngine.Debug.LogException(exception);\n\t\t\t\t\tfileStream.Position = position + num;\n\t\t\t\t\tentData.Dispose();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entData.baseNetworkable.uid.IsValid && hashSet.Contains(entData.baseNetworkable.uid))\n\t\t\t\t{\n\t\t\t\t\tstring[] obj = new string[5] { \"Skipping entity \", null, null, null, null };\n\t\t\t\t\tNetworkableId uid = entData.baseNetworkable.uid;\n\t\t\t\t\tobj[1] = uid.ToString();\n\t\t\t\t\tobj[2] = \" \";\n\t\t\t\t\tobj[3] = StringPool.Get(entData.baseNetworkable.prefabID);\n\t\t\t\t\tobj[4] = \" - uid is used multiple times\";\n\t\t\t\t\tUnityEngine.Debug.LogWarning(string.Concat(obj));\n\t\t\t\t\tentData.Dispose();\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (entData.basePlayer != null)\n\t\t\t\t{\n\t\t\t\t\tif (System.Linq.Enumerable.Any(dictionary, (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> x) => x.Value.basePlayer != null && x.Value.basePlayer.userid == entData.basePlayer.userid))\n\t\t\t\t\t{\n\t\t\t\t\t\tUnityEngine.Debug.LogWarning($\"Skipping entity {entData.baseNetworkable.uid} - it's a player {entData.basePlayer.userid} who is in the save multiple times\");\n\t\t\t\t\t\tentData.Dispose();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (BasePlayer.IsBotId(entData.basePlayer.userid))\n\t\t\t\t\t{\n\t\t\t\t\t\tpooledList.Add(entData.basePlayer.userid);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (entData.baseNetworkable.uid.IsValid)\n\t\t\t\t{\n\t\t\t\t\thashSet.Add(entData.baseNetworkable.uid);\n\t\t\t\t}\n\t\t\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(StringPool.Get(entData.baseNetworkable.prefabID), entData.baseEntity.pos, UnityEngine.Quaternion.Euler(entData.baseEntity.rot));\n\t\t\t\tif ((bool)baseEntity)\n\t\t\t\t{\n\t\t\t\t\tbaseEntity.InitLoad(entData.baseNetworkable.uid);\n\t\t\t\t\tbaseEntity.PreServerLoad();\n\t\t\t\t\tdictionary.Add(baseEntity, entData);\n\t\t\t\t}\n\t\t\t}\n\t\t\tBasePlayer.ReserveBotIds(pooledList);\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"Spawning \" + list.Count + \" entities from map\");\n\t\tforeach (BaseEntity item in list)\n\t\t{\n\t\t\tif (!(item == null))\n\t\t\t{\n\t\t\t\titem.SpawnAsMapEntity();\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tUnityEngine.DebugEx.Log(\"Spawning \" + dictionary.Count + \" entities from save\");\n\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"OnSaveLoad\", dictionary);\n\t\tif (obj2 is bool)\n\t\t{\n\t\t\treturn (bool)obj2;\n\t\t}\n\t\tBaseNetworkable.LoadInfo info = default(BaseNetworkable.LoadInfo);\n\t\tinfo.fromDisk = true;\n\t\tSystem.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();\n\t\tint num2 = 0;\n\t\tforeach (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> item2 in dictionary)\n\t\t{\n\t\t\tBaseEntity key = item2.Key;\n\t\t\tif (key == null)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tFacepunch.RCon.Update();\n\t\t\tinfo.msg = item2.Value;\n\t\t\tkey.Spawn();\n\t\t\tkey.Load(info);\n\t\t\tif (key.IsValid())\n\t\t\t{\n\t\t\t\tnum2++;\n\t\t\t\tif (stopwatch.Elapsed.TotalMilliseconds > 2000.0)\n\t\t\t\t{\n\t\t\t\t\tstopwatch.Reset();\n\t\t\t\t\tstopwatch.Start();\n\t\t\t\t\tUnityEngine.DebugEx.Log(\"\\t\" + num2 + \" / \" + dictionary.Count);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tUnityEngine.DebugEx.Log(\"Postprocessing \" + list.Count + \" entities from map\");\n\t\tforeach (BaseEntity item3 in list)\n\t\t{\n\t\t\tif (!(item3 == null))\n\t\t\t{\n\t\t\t\titem3.PostMapEntitySpawn();\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tUnityEngine.DebugEx.Log(\"Postprocessing \" + list.Count + \" entities from save\");\n\t\tforeach (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> item4 in dictionary)\n\t\t{\n\t\t\tBaseEntity key2 = item4.Key;\n\t\t\tif (!(key2 == null))\n\t\t\t{\n\t\t\t\tFacepunch.RCon.Update();\n\t\t\t\tif (key2.IsValid())\n\t\t\t\t{\n\t\t\t\t\tkey2.UpdateNetworkGroup();\n\t\t\t\t\tkey2.PostServerLoad();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\tforeach (System.Collections.Generic.KeyValuePair<BaseEntity, ProtoBuf.Entity> item5 in dictionary)\n\t\t{\n\t\t\t_ = item5.Value;\n\t\t\titem5.Value.Dispose();\n\t\t}\n\t\tdictionary.Clear();\n\t\tif ((bool)SingletonComponent<SpawnHandler>.Instance)\n\t\t{\n\t\t\tUnityEngine.DebugEx.Log(\"Enforcing SpawnPopulation Limits\");\n\t\t\tSingletonComponent<SpawnHandler>.Instance.EnforceLimits();\n\t\t\tUnityEngine.DebugEx.Log(\"\\tdone.\");\n\t\t}\n\t\tInitializeWipeId();\n\t\tRust.Application.isLoadingSave = false;\n\t\treturn true;\n\t}\n\tcatch (System.Exception exception2)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Error loading save (\" + strFilename + \")\");\n\t\tUnityEngine.Debug.LogException(exception2);\n\t\treturn false;\n\t}\n}\n",
      "ParametersText": "System.Collections.Generic.Dictionary`2[BaseEntity,ProtoBuf.Entity] local1",
      "TargetName": "SaveRestore",
      "MethodName": "Load",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2396958305,
      "Name": "OnServerSave",
      "FullName": "OnServerSave",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a server saves."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[System.Runtime.CompilerServices.IteratorStateMachine(typeof(SaveRestore.<DoAutomatedSave>d__20))]\nprivate System.Collections.IEnumerator DoAutomatedSave(bool AndWait = false)\n{\n\tOxide.Core.Interface.CallHook(\"OnServerSave\");\n\treturn new SaveRestore.<DoAutomatedSave>d__20(0)\n\t{\n\t\t<>4__this = this,\n\t\tAndWait = AndWait\n\t};\n}\n",
      "ParametersText": "",
      "TargetName": "SaveRestore",
      "MethodName": "DoAutomatedSave",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 931424179,
      "Name": "OnServerUserSet",
      "FullName": "OnServerUserSet",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when server user set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void Set(ulong uid, ServerUsers.UserGroup group, string username, string notes, long expiry = -1L)\n{\n\tRemove(uid);\n\tServerUsers.User value = new ServerUsers.User\n\t{\n\t\tsteamid = uid,\n\t\tgroup = group,\n\t\tusername = username,\n\t\tnotes = notes,\n\t\texpiry = expiry\n\t};\n\tOxide.Core.Interface.CallHook(\"OnServerUserSet\", uid, group, username, notes, expiry);\n\tusers.Add(uid, value);\n}\n",
      "ParametersText": "",
      "TargetName": "ServerUsers",
      "MethodName": "Set",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2043356880,
      "Name": "OnServerUserRemove",
      "FullName": "OnServerUserRemove",
      "Category": "Server",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a server user is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void Remove(ulong uid)\n{\n\tOxide.Core.Interface.CallHook(\"OnServerUserRemove\", uid);\n\tusers.Remove(uid);\n}\n",
      "ParametersText": "",
      "TargetName": "ServerUsers",
      "MethodName": "Remove",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 156775275,
      "Name": "OnSendCommand",
      "FullName": "OnSendCommand",
      "Category": "Server",
      "Parameters": [
        {
          "name": "cn",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "strCommand",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "args",
          "typeName": "System.Object[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void SendClientCommand(Network.Connection cn, string strCommand, params object[] args)\n{\n\tif (Network.Net.sv.IsConnected() && Oxide.Core.Interface.CallHook(\"OnSendCommand\", cn, strCommand, args) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tnetWrite.PacketID(Network.Message.Type.ConsoleCommand);\n\t\tstring val = ConsoleSystem.BuildCommand(strCommand, args);\n\t\tnetWrite.String(val);\n\t\tif (Network.PacketProfiler.shouldCaptureDetailedProfiling)\n\t\t{\n\t\t\tNetwork.PacketProfiler.LogDetailedOutbound(Network.Message.Type.ConsoleCommand, NetworkableId.EmptyId, null, (int)netWrite.Length, null, Facepunch.Math.Epoch.Current, server: true, strCommand);\n\t\t}\n\t\tnetWrite.Send(new Network.SendInfo(cn));\n\t}\n}\n",
      "ParametersText": "Network.Connection cn, string strCommand, System.Object[] args",
      "TargetName": "ConsoleNetwork",
      "MethodName": "SendClientCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 156775275,
      "Name": "OnSendCommand",
      "FullName": "OnSendCommand [list]",
      "Category": "Server",
      "Parameters": [
        {
          "name": "cn",
          "typeName": "Network.Connection",
          "optional": false
        },
        {
          "name": "strCommand",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "args",
          "typeName": "System.Object[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void SendClientCommand(Network.Connection cn, string strCommand, params object[] args)\n{\n\tif (Network.Net.sv.IsConnected() && Oxide.Core.Interface.CallHook(\"OnSendCommand\", cn, strCommand, args) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tnetWrite.PacketID(Network.Message.Type.ConsoleCommand);\n\t\tstring val = ConsoleSystem.BuildCommand(strCommand, args);\n\t\tnetWrite.String(val);\n\t\tif (Network.PacketProfiler.shouldCaptureDetailedProfiling)\n\t\t{\n\t\t\tNetwork.PacketProfiler.LogDetailedOutbound(Network.Message.Type.ConsoleCommand, NetworkableId.EmptyId, null, (int)netWrite.Length, null, Facepunch.Math.Epoch.Current, server: true, strCommand);\n\t\t}\n\t\tnetWrite.Send(new Network.SendInfo(cn));\n\t}\n}\n",
      "ParametersText": "Network.Connection cn, string strCommand, System.Object[] args",
      "TargetName": "ConsoleNetwork",
      "MethodName": "SendClientCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4110903621,
      "Name": "OnBroadcastCommand",
      "FullName": "OnBroadcastCommand",
      "Category": "Server",
      "Parameters": [
        {
          "name": "strCommand",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "args",
          "typeName": "System.Object[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a server console command is executed.",
        "Useful for auditing or overriding server-side console commands."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void BroadcastToAllClients(string strCommand, params object[] args)\n{\n\tif (Network.Net.sv.IsConnected() && Oxide.Core.Interface.CallHook(\"OnBroadcastCommand\", strCommand, args) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tnetWrite.PacketID(Network.Message.Type.ConsoleCommand);\n\t\tnetWrite.String(ConsoleSystem.BuildCommand(strCommand, args));\n\t\tnetWrite.Send(new Network.SendInfo(Network.Net.sv.connections));\n\t}\n}\n",
      "ParametersText": "string strCommand, System.Object[] args",
      "TargetName": "ConsoleNetwork",
      "MethodName": "BroadcastToAllClients",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3983888645,
      "Name": "OnRconConnection",
      "FullName": "OnRconConnection [web]",
      "Category": "Server",
      "Parameters": [
        {
          "name": "clientIpAddress",
          "typeName": "System.Net.IPAddress",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when rcon connection occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "System.Net.IPAddress clientIpAddress",
      "TargetName": "Facepunch.Rcon.Listener/<>c__DisplayClass30_0",
      "MethodName": "<Start>b__0",
      "AssemblyName": "Facepunch.Rcon",
      "ReturnTypeName": "void"
    }
  ],
  "Structure": [
    {
      "Id": 2217887722,
      "Name": "OnCupboardAssign",
      "FullName": "OnCupboardAssign",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "priv",
          "typeName": "BuildingPrivlidge",
          "optional": false
        },
        {
          "name": "targetId",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when cupboard assign occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private static object IOnCupboardAuthorize(ulong userID, BasePlayer player, BuildingPrivlidge privlidge)\n{\n\tif (userID == (ulong)player.userID)\n\t{\n\t\tif (Carbon.HookCaller.CallStaticHook(1460091328u, privlidge, player) != null)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\telse if (Carbon.HookCaller.CallStaticHook(2217887722u, privlidge, userID, player) != null)\n\t{\n\t\treturn true;\n\t}\n\treturn null;\n}\n",
      "ParametersText": "BuildingPrivlidge priv, ulong targetId, BasePlayer player",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnCupboardAuthorize",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "object"
    },
    {
      "Id": 1460091328,
      "Name": "OnCupboardAuthorize",
      "FullName": "OnCupboardAuthorize",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "priv",
          "typeName": "BuildingPrivlidge",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 16,
      "Descriptions": [
        "Called when cupboard authorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private static object IOnCupboardAuthorize(ulong userID, BasePlayer player, BuildingPrivlidge privlidge)\n{\n\tif (userID == (ulong)player.userID)\n\t{\n\t\tif (Carbon.HookCaller.CallStaticHook(1460091328u, privlidge, player) != null)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t}\n\telse if (Carbon.HookCaller.CallStaticHook(2217887722u, privlidge, userID, player) != null)\n\t{\n\t\treturn true;\n\t}\n\treturn null;\n}\n",
      "ParametersText": "BuildingPrivlidge priv, BasePlayer player",
      "TargetName": "Carbon.Core.CorePlugin",
      "MethodName": "IOnCupboardAuthorize",
      "AssemblyName": "Carbon.Common",
      "ReturnTypeName": "object"
    },
    {
      "Id": 2341690695,
      "Name": "OnWallpaperSet",
      "FullName": "OnWallpaperSet",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "id",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "side",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "rotation",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when wallpaper set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetWallpaper(ulong id, int side = 0, float rotation = 0f)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnWallpaperSet\", this, id, side, rotation) != null)\n\t{\n\t\treturn;\n\t}\n\tif (side == 0)\n\t{\n\t\tif (HasWallpaper(side) && wallpaperID == id && wallpaperRotation == rotation)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\twallpaperID = id;\n\t\twallpaperHealth = 100f;\n\t\twallpaperRotation = rotation;\n\t}\n\telse\n\t{\n\t\tif (HasWallpaper(side) && wallpaperID2 == id && wallpaperRotation2 == rotation)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\twallpaperID2 = id;\n\t\twallpaperHealth2 = 100f;\n\t\twallpaperRotation2 = rotation;\n\t}\n\tif (base.isServer)\n\t{\n\t\tSetConditionalModel(currentSkin.DetermineConditionalModelState(this));\n\t\tSendNetworkUpdateImmediate();\n\t\tClientRPC(RpcTarget.NetworkGroup(\"RefreshSkin\"));\n\t}\n}\n",
      "ParametersText": "BuildingBlock buildingBlock, ulong id, int side, float rotation",
      "TargetName": "BuildingBlock",
      "MethodName": "SetWallpaper",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2942868991,
      "Name": "OnWallpaperRemove",
      "FullName": "OnWallpaperRemove",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "side",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a wallpaper is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RemoveWallpaper(int side)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnWallpaperRemove\", this, side) == null)\n\t{\n\t\tswitch (side)\n\t\t{\n\t\tcase 0:\n\t\t\twallpaperHealth = -1f;\n\t\t\twallpaperID = 0uL;\n\t\t\twallpaperRotation = 0f;\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\twallpaperHealth2 = -1f;\n\t\t\twallpaperID2 = 0uL;\n\t\t\twallpaperRotation2 = 0f;\n\t\t\tbreak;\n\t\t}\n\t\tif (base.isServer)\n\t\t{\n\t\t\tSetConditionalModel(currentSkin.DetermineConditionalModelState(this));\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"RefreshSkin\"));\n\t\t}\n\t}\n}\n",
      "ParametersText": "BuildingBlock buildingBlock, int side",
      "TargetName": "BuildingBlock",
      "MethodName": "RemoveWallpaper",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1205776686,
      "Name": "OnStructureUpgrade",
      "FullName": "OnStructureUpgrade",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "type",
          "typeName": "BuildingGrade+Enum",
          "optional": false
        },
        {
          "name": "skin",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a structure upgrades."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void DoUpgradeToGrade(BaseEntity.RPCMessage msg)\n{\n\tif (!msg.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tConstructionGrade constructionGrade = blockDefinition.GetGrade((BuildingGrade.Enum)msg.read.Int32(), msg.read.UInt64());\n\tif (constructionGrade == null)\n\t{\n\t\treturn;\n\t}\n\tif (!CanChangeToGrade(constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin, msg.player))\n\t{\n\t\tif (!(DeployVolume.LastDeployHit != null))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tBaseEntity baseEntity = UnityEngine.GameObjectEx.ToBaseEntity(DeployVolume.LastDeployHit);\n\t\tif (baseEntity != null && baseEntity is BasePlayer basePlayer)\n\t\t{\n\t\t\tulong currentTeam = msg.player.currentTeam;\n\t\t\tif (currentTeam != 0L && currentTeam == basePlayer.currentTeam)\n\t\t\t{\n\t\t\t\tstring playerNameStreamSafe = NameHelper.GetPlayerNameStreamSafe(msg.player, basePlayer);\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, ConstructionErrors.BlockedByPlayer, false, playerNameStreamSafe);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnStructureUpgrade\", this, msg.player, constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin) != null || !CanAffordUpgrade(constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin, msg.player))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (base.SecondsSinceAttacked < 30f)\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, ConstructionErrors.CantUpgradeRecentlyDamaged, false, (30f - base.SecondsSinceAttacked).ToString(\"N0\"));\n\t\t\treturn;\n\t\t}\n\t\tif (!constructionGrade.gradeBase.alwaysUnlock && constructionGrade.gradeBase.skin != 0L && !msg.player.blueprints.steamInventory.HasItem((int)constructionGrade.gradeBase.skin))\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, ConstructionErrors.SkinNotOwned, false);\n\t\t\treturn;\n\t\t}\n\t\tPayForUpgrade(constructionGrade, msg.player);\n\t\tif (msg.player != null)\n\t\t{\n\t\t\tplayerCustomColourToApply = GetShippingContainerBlockColourForPlayer(msg.player);\n\t\t}\n\t\tClientRPC(RpcTarget.NetworkGroup(\"DoUpgradeEffect\"), (int)constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin);\n\t\tBuildingGrade.Enum @enum = grade;\n\t\tOnSkinChanged(skinID, constructionGrade.gradeBase.skin);\n\t\tChangeGrade(constructionGrade.gradeBase.type, playEffect: true);\n\t\tFacepunch.Rust.Analytics.Azure.OnBuildingBlockUpgraded(msg.player, this, constructionGrade.gradeBase.type, playerCustomColourToApply, constructionGrade.gradeBase.skin, GetComponentInChildren<ConstructionSkin_CustomDetail>() != null);\n\t\tif (msg.player != null && @enum != constructionGrade.gradeBase.type)\n\t\t{\n\t\t\tmsg.player.ProcessMissionEvent(BaseMission.MissionEventType.UPGRADE_BUILDING_GRADE, new BaseMission.MissionEventPayload\n\t\t\t{\n\t\t\t\tNetworkIdentifier = net.ID,\n\t\t\t\tIntIdentifier = (int)constructionGrade.gradeBase.type\n\t\t\t}, 1f);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnStructureUpgraded\", this, msg.player, constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin);\n\t\ttimePlaced = GetNetworkTime();\n\t}\n}\n",
      "ParametersText": "BuildingBlock buildingBlock, BasePlayer player, BuildingGrade.Enum type, ulong skin",
      "TargetName": "BuildingBlock",
      "MethodName": "DoUpgradeToGrade",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2456561425,
      "Name": "OnStructureRotate",
      "FullName": "OnStructureRotate",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a structure is rotated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void DoRotation(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && CanRotate(msg.player) && blockDefinition.canRotateAfterPlacement && Oxide.Core.Interface.CallHook(\"OnStructureRotate\", this, msg.player) == null)\n\t{\n\t\tbase.transform.localRotation *= UnityEngine.Quaternion.Euler(blockDefinition.rotationAmount);\n\t\tRefreshEntityLinks();\n\t\tUpdateSurroundingEntities();\n\t\tUpdateSkin(force: true);\n\t\tRefreshNeighbours(linkToNeighbours: false);\n\t\tSendNetworkUpdateImmediate();\n\t\tClientRPC(RpcTarget.NetworkGroup(\"RefreshSkin\"));\n\t\tif (!globalNetworkCooldown)\n\t\t{\n\t\t\tglobalNetworkCooldown = true;\n\t\t\tGlobalNetworkHandler.server.TrySendNetworkUpdate(this);\n\t\t\tCancelInvoke(ResetGlobalNetworkCooldown);\n\t\t\tInvoke(ResetGlobalNetworkCooldown, 15f);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BuildingBlock buildingBlock, BasePlayer player",
      "TargetName": "BuildingBlock",
      "MethodName": "DoRotation",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2341649796,
      "Name": "CanChangeGrade",
      "FullName": "CanChangeGrade",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "iGrade",
          "typeName": "BuildingGrade+Enum",
          "optional": false
        },
        {
          "name": "iSkin",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to change grade.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanChangeToGrade(BuildingGrade.Enum iGrade, ulong iSkin, BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanChangeGrade\", player, this, iGrade, iSkin);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player.IsInCreativeMode && ConVar.Creative.freeBuild)\n\t{\n\t\treturn true;\n\t}\n\tif (HasUpgradePrivilege(iGrade, iSkin, player))\n\t{\n\t\treturn !IsUpgradeBlocked();\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, BuildingBlock buildingBlock, BuildingGrade.Enum iGrade, ulong iSkin",
      "TargetName": "BuildingBlock",
      "MethodName": "CanChangeToGrade",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2695125739,
      "Name": "CanAffordUpgrade",
      "FullName": "CanAffordUpgrade",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "iGrade",
          "typeName": "BuildingGrade+Enum",
          "optional": false
        },
        {
          "name": "iSkin",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to afford upgrade.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanAffordUpgrade(BuildingGrade.Enum iGrade, ulong iSkin, BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAffordUpgrade\", player, this, iGrade, iSkin);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player != null && player.IsInCreativeMode && ConVar.Creative.freeBuild)\n\t{\n\t\treturn true;\n\t}\n\tif (!ConVar.Decay.CanUpgradeToGrade(iGrade))\n\t{\n\t\treturn false;\n\t}\n\tforeach (ItemAmount item in blockDefinition.GetGrade(iGrade, iSkin).CostToBuild(grade))\n\t{\n\t\tif ((float)player.inventory.GetAmount(item.itemid) < item.amount)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, BuildingBlock buildingBlock, BuildingGrade.Enum iGrade, ulong iSkin",
      "TargetName": "BuildingBlock",
      "MethodName": "CanAffordUpgrade",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1273375130,
      "Name": "OnPlayerPveDamage",
      "FullName": "OnPlayerPveDamage [BuildingBlock]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "initiator",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        },
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a player pve is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Hurt(HitInfo info)\n{\n\tif (ConVar.Server.pve && (bool)info.Initiator && info.Initiator is BasePlayer)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerPveDamage\", info.Initiator, info, this) == null)\n\t\t{\n\t\t\t(info.Initiator as BasePlayer).Hurt(info.damageTypes.Total(), Rust.DamageType.Generic);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif ((bool)info.Initiator && info.Initiator is BasePlayer { IsInTutorial: not false })\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (HasWallpaper())\n\t\t{\n\t\t\tRust.DamageType majorityDamageType = info.damageTypes.GetMajorityDamageType();\n\t\t\tbool flag = info.damageTypes.Contains(Rust.DamageType.Explosion);\n\t\t\tRust.DamageTypeList damageTypeList = info.damageTypes.Clone();\n\t\t\tif (wallpaperProtection != null)\n\t\t\t{\n\t\t\t\twallpaperProtection.Scale(damageTypeList);\n\t\t\t}\n\t\t\tfloat totalDamage = damageTypeList.Total();\n\t\t\tif (majorityDamageType == Rust.DamageType.Decay || flag || majorityDamageType == Rust.DamageType.Heat)\n\t\t\t{\n\t\t\t\tDamageWallpaper(totalDamage);\n\t\t\t\tDamageWallpaper(totalDamage, 1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbool flag2 = false;\n\t\t\t\tfor (int i = 0; i < propDirection.Length; i++)\n\t\t\t\t{\n\t\t\t\t\tif (propDirection[i].IsWeakspot(base.transform, info))\n\t\t\t\t\t{\n\t\t\t\t\t\tflag2 = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tDamageWallpaper(totalDamage, (!flag2) ? 1 : 0);\n\t\t\t}\n\t\t}\n\t\tbase.Hurt(info);\n\t}\n}\n",
      "ParametersText": "BaseEntity initiator, HitInfo info, BuildingBlock buildingBlock",
      "TargetName": "BuildingBlock",
      "MethodName": "Hurt",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1926574503,
      "Name": "OnStructureUpgraded",
      "FullName": "OnStructureUpgraded",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingBlock",
          "typeName": "BuildingBlock",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "type",
          "typeName": "BuildingGrade+Enum",
          "optional": false
        },
        {
          "name": "skin",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a structure is upgraded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void DoUpgradeToGrade(BaseEntity.RPCMessage msg)\n{\n\tif (!msg.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tConstructionGrade constructionGrade = blockDefinition.GetGrade((BuildingGrade.Enum)msg.read.Int32(), msg.read.UInt64());\n\tif (constructionGrade == null)\n\t{\n\t\treturn;\n\t}\n\tif (!CanChangeToGrade(constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin, msg.player))\n\t{\n\t\tif (!(DeployVolume.LastDeployHit != null))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tBaseEntity baseEntity = UnityEngine.GameObjectEx.ToBaseEntity(DeployVolume.LastDeployHit);\n\t\tif (baseEntity != null && baseEntity is BasePlayer basePlayer)\n\t\t{\n\t\t\tulong currentTeam = msg.player.currentTeam;\n\t\t\tif (currentTeam != 0L && currentTeam == basePlayer.currentTeam)\n\t\t\t{\n\t\t\t\tstring playerNameStreamSafe = NameHelper.GetPlayerNameStreamSafe(msg.player, basePlayer);\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, ConstructionErrors.BlockedByPlayer, false, playerNameStreamSafe);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnStructureUpgrade\", this, msg.player, constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin) != null || !CanAffordUpgrade(constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin, msg.player))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (base.SecondsSinceAttacked < 30f)\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, ConstructionErrors.CantUpgradeRecentlyDamaged, false, (30f - base.SecondsSinceAttacked).ToString(\"N0\"));\n\t\t\treturn;\n\t\t}\n\t\tif (!constructionGrade.gradeBase.alwaysUnlock && constructionGrade.gradeBase.skin != 0L && !msg.player.blueprints.steamInventory.HasItem((int)constructionGrade.gradeBase.skin))\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, ConstructionErrors.SkinNotOwned, false);\n\t\t\treturn;\n\t\t}\n\t\tPayForUpgrade(constructionGrade, msg.player);\n\t\tif (msg.player != null)\n\t\t{\n\t\t\tplayerCustomColourToApply = GetShippingContainerBlockColourForPlayer(msg.player);\n\t\t}\n\t\tClientRPC(RpcTarget.NetworkGroup(\"DoUpgradeEffect\"), (int)constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin);\n\t\tBuildingGrade.Enum @enum = grade;\n\t\tOnSkinChanged(skinID, constructionGrade.gradeBase.skin);\n\t\tChangeGrade(constructionGrade.gradeBase.type, playEffect: true);\n\t\tFacepunch.Rust.Analytics.Azure.OnBuildingBlockUpgraded(msg.player, this, constructionGrade.gradeBase.type, playerCustomColourToApply, constructionGrade.gradeBase.skin, GetComponentInChildren<ConstructionSkin_CustomDetail>() != null);\n\t\tif (msg.player != null && @enum != constructionGrade.gradeBase.type)\n\t\t{\n\t\t\tmsg.player.ProcessMissionEvent(BaseMission.MissionEventType.UPGRADE_BUILDING_GRADE, new BaseMission.MissionEventPayload\n\t\t\t{\n\t\t\t\tNetworkIdentifier = net.ID,\n\t\t\t\tIntIdentifier = (int)constructionGrade.gradeBase.type\n\t\t\t}, 1f);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnStructureUpgraded\", this, msg.player, constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin);\n\t\ttimePlaced = GetNetworkTime();\n\t}\n}\n",
      "ParametersText": "BuildingBlock buildingBlock, BasePlayer player, BuildingGrade.Enum type, ulong skin",
      "TargetName": "BuildingBlock",
      "MethodName": "DoUpgradeToGrade",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3504585821,
      "Name": "OnStructureDemolish",
      "FullName": "OnStructureDemolish [immediate = true]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "decayEntity",
          "typeName": "DecayEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when structure demolish occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void DoImmediateDemolish(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && msg.player.IsAdmin && Oxide.Core.Interface.CallHook(\"OnStructureDemolish\", this, msg.player, true) == null)\n\t{\n\t\tStabilityEntity stabilityEntity = this as StabilityEntity;\n\t\tif (stabilityEntity != null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnBuildingBlockDemolished(msg.player, stabilityEntity);\n\t\t}\n\t\tKill(BaseNetworkable.DestroyMode.Gib);\n\t}\n}\n",
      "ParametersText": "DecayEntity decayEntity, BasePlayer player",
      "TargetName": "DecayEntity",
      "MethodName": "DoImmediateDemolish",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3504585821,
      "Name": "OnStructureDemolish",
      "FullName": "OnStructureDemolish [immediate = false]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "decayEntity",
          "typeName": "DecayEntity",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when structure demolish occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void DoDemolish(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && CanDemolish(msg.player) && Oxide.Core.Interface.CallHook(\"OnStructureDemolish\", this, msg.player, false) == null)\n\t{\n\t\tStabilityEntity stabilityEntity = this as StabilityEntity;\n\t\tif (stabilityEntity != null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnBuildingBlockDemolished(msg.player, stabilityEntity);\n\t\t}\n\t\tKill(BaseNetworkable.DestroyMode.Gib);\n\t}\n}\n",
      "ParametersText": "DecayEntity decayEntity, BasePlayer player",
      "TargetName": "DecayEntity",
      "MethodName": "DoDemolish",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 334281728,
      "Name": "CanDemolish",
      "FullName": "CanDemolish",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "decayEntity",
          "typeName": "DecayEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to demolish.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanDemolish(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanDemolish\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (IsDemolishSupported && IsDemolishable())\n\t{\n\t\treturn HasDemolishPrivilege(player);\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, DecayEntity decayEntity",
      "TargetName": "DecayEntity",
      "MethodName": "CanDemolish",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1270763772,
      "Name": "OnSignLocked",
      "FullName": "OnSignLocked [Signage]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "signage",
          "typeName": "Signage",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sign is locked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void LockSign(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && CanUpdateSign(msg.player))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Locked, b: true);\n\t\tSendNetworkUpdate();\n\t\tbase.OwnerID = msg.player.userID;\n\t\tOxide.Core.Interface.CallHook(\"OnSignLocked\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "Signage signage, BasePlayer player",
      "TargetName": "Signage",
      "MethodName": "LockSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2635396024,
      "Name": "OnSignUpdated",
      "FullName": "OnSignUpdated [Signage]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "signage",
          "typeName": "Signage",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sign is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.MaxDistance(5f)]\npublic void UpdateSign(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player == null || !CanUpdateSign(msg.player))\n\t{\n\t\treturn;\n\t}\n\tint num = msg.read.Int32();\n\tif (num < 0 || num >= paintableSources.Length)\n\t{\n\t\treturn;\n\t}\n\tbyte[] array = msg.read.BytesWithSize();\n\tif (msg.read.Unread > 0 && msg.read.Bit() && !msg.player.IsAdmin)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"{msg.player} tried to upload a sign from a file but they aren't admin, ignoring\");\n\t\treturn;\n\t}\n\tEnsureInitialized();\n\tif (array == null)\n\t{\n\t\tif (textureIDs[num] != 0)\n\t\t{\n\t\t\tFileStorage.server.RemoveExact(textureIDs[num], FileStorage.Type.png, net.ID, (uint)num);\n\t\t}\n\t\ttextureIDs[num] = 0u;\n\t}\n\telse\n\t{\n\t\tif (!ImageProcessing.IsValidPNG(array, 1024, 1024))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (textureIDs[num] != 0)\n\t\t{\n\t\t\tFileStorage.server.RemoveExact(textureIDs[num], FileStorage.Type.png, net.ID, (uint)num);\n\t\t}\n\t\ttextureIDs[num] = FileStorage.server.Store(array, FileStorage.Type.png, net.ID, (uint)num);\n\t}\n\tLogEdit(msg.player);\n\tSendNetworkUpdate();\n\tOxide.Core.Interface.CallHook(\"OnSignUpdated\", this, msg.player, num);\n}\n",
      "ParametersText": "Signage signage, BasePlayer player, int local0",
      "TargetName": "Signage",
      "MethodName": "UpdateSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 449010576,
      "Name": "OnDoorOpened",
      "FullName": "OnDoorOpened",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "door",
          "typeName": "Door",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a door is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprotected void RPC_OpenDoor(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.CanInteract(usableWhileCrawling: true) || !canHandOpen || IsOpen() || IsBusy() || IsLocked() || IsInvoking(DelayedDoorOpening) || !CanDoorBeOpened())\n\t{\n\t\treturn;\n\t}\n\tif (rpc.player.IsWounded())\n\t{\n\t\tif (!woundedOpens.ContainsKey(rpc.player) || !((float)woundedOpens[rpc.player] > 2.5f))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\twoundedOpens.Remove(rpc.player);\n\t}\n\tBaseLock baseLock = GetSlot(BaseEntity.Slot.Lock) as BaseLock;\n\tif (baseLock != null)\n\t{\n\t\tif (!baseLock.OnTryToOpen(rpc.player))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (baseLock.IsLocked() && UnityEngine.Time.realtimeSinceStartup - decayResetTimeLast > 60f)\n\t\t{\n\t\t\tBuildingBlock buildingBlock = FindLinkedEntity<BuildingBlock>();\n\t\t\tif ((bool)buildingBlock)\n\t\t\t{\n\t\t\t\tDecay.BuildingDecayTouch(buildingBlock);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tDecay.RadialDecayTouch(base.transform.position, 40f, 2097408);\n\t\t\t}\n\t\t\tdecayResetTimeLast = UnityEngine.Time.realtimeSinceStartup;\n\t\t}\n\t}\n\tif (canReverseOpen)\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved1, base.transform.InverseTransformPoint(rpc.player.transform.position).x > 0f, recursive: false, networkupdate: false);\n\t}\n\tif (ShouldDelayOpen(rpc.player, out var delay))\n\t{\n\t\tInvoke(DelayedDoorOpening, delay);\n\t}\n\telse\n\t{\n\t\tSetFlag(BaseEntity.Flags.Open, b: true);\n\t\tSendNetworkUpdateImmediate();\n\t}\n\tif (isSecurityDoor && NavMeshLink != null)\n\t{\n\t\tSetNavMeshLinkEnabled(wantsOn: true);\n\t}\n\tif (checkPhysBoxesOnOpen)\n\t{\n\t\tStartCheckingForBlockages(isOpening: true);\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnBaseInteract(rpc.player, this);\n\tOnPlayerOpenedDoor(rpc.player);\n\tOxide.Core.Interface.CallHook(\"OnDoorOpened\", this, rpc.player);\n}\n",
      "ParametersText": "Door door, BasePlayer player",
      "TargetName": "Door",
      "MethodName": "RPC_OpenDoor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1955326364,
      "Name": "OnDoorClosed",
      "FullName": "OnDoorClosed",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "door",
          "typeName": "Door",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a door is closed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void RPC_CloseDoor(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.CanInteract(usableWhileCrawling: true) || !canHandOpen || !IsOpen() || IsBusy() || IsLocked())\n\t{\n\t\treturn;\n\t}\n\tif (rpc.player.IsWounded())\n\t{\n\t\tif (!woundedCloses.ContainsKey(rpc.player) || !((float)woundedCloses[rpc.player] > 2.5f))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\twoundedCloses.Remove(rpc.player);\n\t}\n\tBaseLock baseLock = GetSlot(BaseEntity.Slot.Lock) as BaseLock;\n\tif (!(baseLock != null) || baseLock.OnTryToClose(rpc.player))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Open, b: false);\n\t\tSendNetworkUpdateImmediate();\n\t\tif (isSecurityDoor && NavMeshLink != null)\n\t\t{\n\t\t\tSetNavMeshLinkEnabled(wantsOn: false);\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnBaseInteract(rpc.player, this);\n\t\tStartCheckingForBlockages(isOpening: false);\n\t\tOnPlayerClosedDoor(rpc.player);\n\t\tOxide.Core.Interface.CallHook(\"OnDoorClosed\", this, rpc.player);\n\t}\n}\n",
      "ParametersText": "Door door, BasePlayer player",
      "TargetName": "Door",
      "MethodName": "RPC_CloseDoor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 640250473,
      "Name": "OnDoorKnocked",
      "FullName": "OnDoorKnocked [Door]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "door",
          "typeName": "Door",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a door is knocked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void RPC_KnockDoor(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.CanInteract(usableWhileCrawling: true) || !knockEffect.isValid || UnityEngine.Time.realtimeSinceStartup < nextKnockTime)\n\t{\n\t\treturn;\n\t}\n\tnextKnockTime = UnityEngine.Time.realtimeSinceStartup + 0.5f;\n\tBaseEntity slot = GetSlot(BaseEntity.Slot.LowerCenterDecoration);\n\tif (slot != null)\n\t{\n\t\tDoorKnocker component = slot.GetComponent<DoorKnocker>();\n\t\tif ((bool)component)\n\t\t{\n\t\t\tcomponent.Knock(rpc.player);\n\t\t\treturn;\n\t\t}\n\t}\n\tEffect.server.Run(knockEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\tOxide.Core.Interface.CallHook(\"OnDoorKnocked\", this, rpc.player);\n}\n",
      "ParametersText": "Door door, BasePlayer player",
      "TargetName": "Door",
      "MethodName": "RPC_KnockDoor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4229965862,
      "Name": "OnHammerHit",
      "FullName": "OnHammerHit",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a hammer hits."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DoAttackShared(HitInfo info)\n{\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tBaseCombatEntity baseCombatEntity = info.HitEntity as BaseCombatEntity;\n\tif (base.isServer && baseCombatEntity != null && baseCombatEntity.ShouldRepairViaParent())\n\t{\n\t\tBaseCombatEntity repairableParent = baseCombatEntity.GetRepairableParent();\n\t\tif (repairableParent != null)\n\t\t{\n\t\t\tbaseCombatEntity = repairableParent;\n\t\t}\n\t}\n\tif (baseCombatEntity != null && ownerPlayer != null && base.isServer)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnHammerHit\", ownerPlayer, info) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tusing (TimeWarning.New(\"DoRepair\", 50))\n\t\t{\n\t\t\tbaseCombatEntity.DoRepair(ownerPlayer);\n\t\t}\n\t}\n\tinfo.DoDecals = false;\n\tif (base.isServer)\n\t{\n\t\tEffect.server.ImpactEffect(info);\n\t}\n\telse\n\t{\n\t\tEffect.client.ImpactEffect(info);\n\t}\n\tStartAttackCooldown(repeatDelay);\n}\n",
      "ParametersText": "BasePlayer local0, HitInfo info",
      "TargetName": "Hammer",
      "MethodName": "DoAttackShared",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1586842410,
      "Name": "OnStructureRepair",
      "FullName": "OnStructureRepair",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "baseCombatEntity",
          "typeName": "BaseCombatEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a structure is repaired."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void DoRepair(BasePlayer player)\n{\n\tBasePlayer player2 = player;\n\tif (!repair.enabled || Oxide.Core.Interface.CallHook(\"OnStructureRepair\", this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = GetDamageRepairCooldown();\n\tif (player2.IsInCreativeMode && ConVar.Creative.freeRepair)\n\t{\n\t\tnum = 0f;\n\t}\n\tif (SecondsSinceAttacked <= num)\n\t{\n\t\tOnRepairFailed(player2, RecentlyDamagedError, (num - SecondsSinceAttacked).ToString(\"N0\"));\n\t\treturn;\n\t}\n\tfloat num2 = MaxHealth() - Health();\n\tfloat num3 = num2 / MaxHealth();\n\tif (num2 <= 0f || num3 <= 0f)\n\t{\n\t\tOnRepairFailed(player2, NotDamagedError);\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<ItemAmount> list = RepairCost(num3);\n\tif (list == null)\n\t{\n\t\treturn;\n\t}\n\tfloat num4 = System.Linq.Enumerable.Sum(list, (ItemAmount x) => x.amount);\n\tfloat healthBefore = health;\n\tif (player2.IsInCreativeMode && ConVar.Creative.freeRepair)\n\t{\n\t\tnum4 = 0f;\n\t}\n\tif (num4 > 0f)\n\t{\n\t\tfloat num5 = System.Linq.Enumerable.Min(list, (ItemAmount x) => UnityEngine.Mathf.Clamp01((float)player2.inventory.GetAmount(x.itemid) / x.amount));\n\t\tif (float.IsNaN(num5))\n\t\t{\n\t\t\tnum5 = 0f;\n\t\t}\n\t\tnum5 = UnityEngine.Mathf.Min(num5, 50f / num2);\n\t\tif (num5 <= 0f)\n\t\t{\n\t\t\tOnRepairFailedResources(player2, list);\n\t\t\treturn;\n\t\t}\n\t\tint num6 = 0;\n\t\tforeach (ItemAmount item in list)\n\t\t{\n\t\t\tint amount = UnityEngine.Mathf.CeilToInt(num5 * item.amount);\n\t\t\tint num7 = player2.inventory.Take(null, item.itemid, amount);\n\t\t\tFacepunch.Rust.Analytics.Azure.LogResource(Facepunch.Rust.Analytics.Azure.ResourceMode.Consumed, \"repair_entity\", item.itemDef.shortname, num7, this, null, safezone: false, null, player2.userID, null, null, null, 0uL);\n\t\t\tif (num7 > 0)\n\t\t\t{\n\t\t\t\tnum6 += num7;\n\t\t\t\tplayer2.Command(\"note.inv\", item.itemid, num7 * -1);\n\t\t\t}\n\t\t}\n\t\tfloat num8 = (float)num6 / num4;\n\t\thealth += num2 * num8;\n\t\tSendNetworkUpdate();\n\t}\n\telse\n\t{\n\t\thealth += num2;\n\t\tSendNetworkUpdate();\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnEntityRepaired(player2, this, healthBefore, health);\n\tif (Health() >= MaxHealth())\n\t{\n\t\tOnRepairFinished(player2);\n\t}\n\telse\n\t{\n\t\tOnRepair();\n\t}\n}\n",
      "ParametersText": "BaseCombatEntity baseCombatEntity",
      "TargetName": "BaseCombatEntity",
      "MethodName": "DoRepair",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1037905375,
      "Name": "OnCupboardDeauthorize",
      "FullName": "OnCupboardDeauthorize",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingPrivlidge",
          "typeName": "BuildingPrivlidge",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cupboard deauthorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RemoveSelfAuthorize(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && CanAdministrate(rpc.player) && Oxide.Core.Interface.CallHook(\"OnCupboardDeauthorize\", this, rpc.player) == null)\n\t{\n\t\tRemovePlayer(rpc.player, rpc.player.userID);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BuildingPrivlidge buildingPrivlidge, BasePlayer player",
      "TargetName": "BuildingPrivlidge",
      "MethodName": "RemoveSelfAuthorize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1797143416,
      "Name": "OnCupboardClearList",
      "FullName": "OnCupboardClearList",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingPrivlidge",
          "typeName": "BuildingPrivlidge",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cupboard clear list occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void ClearList(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && CanAdministrate(rpc.player) && Oxide.Core.Interface.CallHook(\"OnCupboardClearList\", this, rpc.player) == null)\n\t{\n\t\tauthorizedPlayers.Clear();\n\t\tUpdateMaxAuthCapacity();\n\t\tUpdatePrivilegeReceivers();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "BuildingPrivlidge buildingPrivlidge, BasePlayer player",
      "TargetName": "BuildingPrivlidge",
      "MethodName": "ClearList",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1200792620,
      "Name": "OnCupboardProtectionCalculated",
      "FullName": "OnCupboardProtectionCalculated",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "buildingPrivlidge",
          "typeName": "BuildingPrivlidge",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BuildingPrivlidge",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a cupboard protection is calculated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public float GetProtectedMinutes(bool force = false)\n{\n\tif (base.isServer)\n\t{\n\t\tif (!force && UnityEngine.Time.realtimeSinceStartup < nextProtectedCalcTime)\n\t\t{\n\t\t\treturn cachedProtectedMinutes;\n\t\t}\n\t\tnextProtectedCalcTime = UnityEngine.Time.realtimeSinceStartup + 60f;\n\t\tSystem.Collections.Generic.List<ItemAmount> obj = Facepunch.Pool.Get<System.Collections.Generic.List<ItemAmount>>();\n\t\tCalculateUpkeepCostAmounts(obj);\n\t\tfloat num = CalculateUpkeepPeriodMinutes();\n\t\tfloat num2 = -1f;\n\t\tif (base.inventory != null)\n\t\t{\n\t\t\tusing PooledList<Item> pooledList = Facepunch.Pool.Get<PooledList<Item>>();\n\t\t\tforeach (ItemAmount item in obj)\n\t\t\t{\n\t\t\t\tpooledList.Clear();\n\t\t\t\tbase.inventory.FindItemsByItemID(pooledList, item.itemid);\n\t\t\t\tint num3 = System.Linq.Enumerable.Sum(pooledList, (Item x) => x.amount);\n\t\t\t\tif (num3 > 0 && item.amount > 0f)\n\t\t\t\t{\n\t\t\t\t\tfloat num4 = (float)num3 / item.amount * num;\n\t\t\t\t\tif (num2 == -1f || num4 < num2)\n\t\t\t\t\t{\n\t\t\t\t\t\tnum2 = num4;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnum2 = 0f;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (num2 == -1f)\n\t\t\t{\n\t\t\t\tnum2 = 0f;\n\t\t\t}\n\t\t}\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\tcachedProtectedMinutes = num2;\n\t\tOxide.Core.Interface.CallHook(\"OnCupboardProtectionCalculated\", this, cachedProtectedMinutes);\n\t\treturn cachedProtectedMinutes;\n\t}\n\treturn 0f;\n}\n",
      "ParametersText": "BuildingPrivlidge buildingPrivlidge, BuildingPrivlidge self1",
      "TargetName": "BuildingPrivlidge",
      "MethodName": "GetProtectedMinutes",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 269294084,
      "Name": "CanBuild",
      "FullName": "CanBuild",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "planner",
          "typeName": "Planner",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Construction",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "Construction+Target",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to build.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void DoBuild(ProtoBuf.CreateBuilding msg)\n{\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn;\n\t}\n\tConstruction construction = PrefabAttribute.server.Find<Construction>(msg.blockID);\n\tif (construction == null)\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CouldntFindConstruction, false);\n\t\tConstructionErrors.Log(ownerPlayer, msg.blockID.ToString());\n\t\treturn;\n\t}\n\tif (!CanAffordToPlace(construction))\n\t{\n\t\tusing (ProtoBuf.ItemAmountList itemAmountList = Facepunch.Pool.Get<ProtoBuf.ItemAmountList>())\n\t\t{\n\t\t\titemAmountList.amount = Facepunch.Pool.Get<System.Collections.Generic.List<float>>();\n\t\t\titemAmountList.itemID = Facepunch.Pool.Get<System.Collections.Generic.List<int>>();\n\t\t\tGetConstructionCost(itemAmountList, construction);\n\t\t\townerPlayer.ClientRPC(RpcTarget.Player(\"Client_OnRepairFailedResources\", ownerPlayer), itemAmountList);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (ConVar.AntiHack.objectplacement && ownerPlayer.TriggeredMovementAntiHack())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.AntihackWithReason, false, ownerPlayer.lastViolationType.ToString());\n\t\treturn;\n\t}\n\tDeployable deployable = GetDeployable(msg.entity);\n\tif (construction.deployable != deployable)\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.DeployableMismatch, false);\n\t\treturn;\n\t}\n\tConstruction.Target target = default(Construction.Target);\n\tif (msg.entity.IsValid)\n\t{\n\t\ttarget.entity = BaseNetworkable.serverEntities.Find(msg.entity) as BaseEntity;\n\t\tif (target.entity == null)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CouldntFindEntity, false);\n\t\t\tConstructionErrors.Log(ownerPlayer, msg.entity.ToString());\n\t\t\treturn;\n\t\t}\n\t\tmsg.ray = new UnityEngine.Ray(target.entity.transform.TransformPoint(msg.ray.origin), target.entity.transform.TransformDirection(msg.ray.direction));\n\t\tmsg.position = target.entity.transform.TransformPoint(msg.position);\n\t\tmsg.normal = target.entity.transform.TransformDirection(msg.normal);\n\t\tmsg.rotation = target.entity.transform.rotation * msg.rotation;\n\t\tif (msg.isSnapped)\n\t\t{\n\t\t\tmsg.snappedPosition = target.entity.transform.TransformPoint(msg.snappedPosition);\n\t\t\tUnityEngine.Quaternion quaternion = UnityEngine.Quaternion.Euler(msg.snappedRotation);\n\t\t\tmsg.snappedRotation = (target.entity.transform.rotation * quaternion).eulerAngles;\n\t\t}\n\t\tif (msg.socket != 0)\n\t\t{\n\t\t\tstring text = StringPool.Get(msg.socket);\n\t\t\tif (text != \"\")\n\t\t\t{\n\t\t\t\ttarget.socket = FindSocket(text, target.entity.prefabID);\n\t\t\t}\n\t\t\tif (target.socket == null)\n\t\t\t{\n\t\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CouldntFindSocket, false);\n\t\t\t\tConstructionErrors.Log(ownerPlayer, msg.socket.ToString());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse if (target.entity is Door)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CantDeployOnDoor, false);\n\t\t\treturn;\n\t\t}\n\t}\n\ttarget.ray = msg.ray;\n\ttarget.onTerrain = msg.onterrain;\n\ttarget.position = msg.position;\n\ttarget.normal = msg.normal;\n\ttarget.rotation = msg.rotation;\n\ttarget.player = ownerPlayer;\n\ttarget.isHoldingShift = msg.isHoldingShift;\n\ttarget.isSnapped = msg.isSnapped;\n\ttarget.snappedPosition = msg.snappedPosition;\n\ttarget.snappedRotation = msg.snappedRotation;\n\ttarget.valid = true;\n\tif (Oxide.Core.Interface.CallHook(\"CanBuild\", this, construction, target) != null)\n\t{\n\t\treturn;\n\t}\n\tif (ShouldParent(target.entity, deployable))\n\t{\n\t\tPlayerBoat parentPlayerBoat = PlayerBoat.GetParentPlayerBoat(target.entity, includeEntityItself: true);\n\t\tif (parentPlayerBoat != null && (!parentPlayerBoat.VerifyDeployablePlacement(ownerPlayer) || (!construction.canBypassBuildingPermission && !parentPlayerBoat.IsAuthedForBuilding(ownerPlayer))))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tUnityEngine.Vector3 position = ((target.socket != null) ? target.GetWorldPosition() : target.position);\n\t\tfloat num = target.entity.Distance(position);\n\t\tif (num > 1f)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.ParentTooFar, false);\n\t\t\tConstructionErrors.Log(ownerPlayer, num.ToString());\n\t\t\treturn;\n\t\t}\n\t}\n\tif (!construction.canBypassBuildingPermission && !ownerPlayer.CanBuild())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.NoPermission, false);\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = DoBuild(target, construction);\n\tif (baseEntity != null && baseEntity is DecayEntity decayEntity)\n\t{\n\t\tdecayEntity.timePlaced = GetNetworkTime();\n\t}\n\tif (baseEntity != null && baseEntity is BuildingBlock buildingBlock && ownerPlayer.IsInCreativeMode && ConVar.Creative.freeBuild)\n\t{\n\t\tConstructionGrade constructionGrade = construction.grades[msg.setToGrade];\n\t\tif (buildingBlock.currentGrade != constructionGrade)\n\t\t{\n\t\t\tbuildingBlock.ChangeGradeAndSkin(constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin, playEffect: false, updateSkin: true, null);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Planner planner, Construction local1, Construction.Target local3",
      "TargetName": "Planner",
      "MethodName": "DoBuild",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 641201665,
      "Name": "OnEntityBuilt",
      "FullName": "OnEntityBuilt",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "planner",
          "typeName": "Planner",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "UnityEngine.GameObject",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity built occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void DoBuild(ProtoBuf.CreateBuilding msg)\n{\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn;\n\t}\n\tConstruction construction = PrefabAttribute.server.Find<Construction>(msg.blockID);\n\tif (construction == null)\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CouldntFindConstruction, false);\n\t\tConstructionErrors.Log(ownerPlayer, msg.blockID.ToString());\n\t\treturn;\n\t}\n\tif (!CanAffordToPlace(construction))\n\t{\n\t\tusing (ProtoBuf.ItemAmountList itemAmountList = Facepunch.Pool.Get<ProtoBuf.ItemAmountList>())\n\t\t{\n\t\t\titemAmountList.amount = Facepunch.Pool.Get<System.Collections.Generic.List<float>>();\n\t\t\titemAmountList.itemID = Facepunch.Pool.Get<System.Collections.Generic.List<int>>();\n\t\t\tGetConstructionCost(itemAmountList, construction);\n\t\t\townerPlayer.ClientRPC(RpcTarget.Player(\"Client_OnRepairFailedResources\", ownerPlayer), itemAmountList);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (ConVar.AntiHack.objectplacement && ownerPlayer.TriggeredMovementAntiHack())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.AntihackWithReason, false, ownerPlayer.lastViolationType.ToString());\n\t\treturn;\n\t}\n\tDeployable deployable = GetDeployable(msg.entity);\n\tif (construction.deployable != deployable)\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.DeployableMismatch, false);\n\t\treturn;\n\t}\n\tConstruction.Target target = default(Construction.Target);\n\tif (msg.entity.IsValid)\n\t{\n\t\ttarget.entity = BaseNetworkable.serverEntities.Find(msg.entity) as BaseEntity;\n\t\tif (target.entity == null)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CouldntFindEntity, false);\n\t\t\tConstructionErrors.Log(ownerPlayer, msg.entity.ToString());\n\t\t\treturn;\n\t\t}\n\t\tmsg.ray = new UnityEngine.Ray(target.entity.transform.TransformPoint(msg.ray.origin), target.entity.transform.TransformDirection(msg.ray.direction));\n\t\tmsg.position = target.entity.transform.TransformPoint(msg.position);\n\t\tmsg.normal = target.entity.transform.TransformDirection(msg.normal);\n\t\tmsg.rotation = target.entity.transform.rotation * msg.rotation;\n\t\tif (msg.isSnapped)\n\t\t{\n\t\t\tmsg.snappedPosition = target.entity.transform.TransformPoint(msg.snappedPosition);\n\t\t\tUnityEngine.Quaternion quaternion = UnityEngine.Quaternion.Euler(msg.snappedRotation);\n\t\t\tmsg.snappedRotation = (target.entity.transform.rotation * quaternion).eulerAngles;\n\t\t}\n\t\tif (msg.socket != 0)\n\t\t{\n\t\t\tstring text = StringPool.Get(msg.socket);\n\t\t\tif (text != \"\")\n\t\t\t{\n\t\t\t\ttarget.socket = FindSocket(text, target.entity.prefabID);\n\t\t\t}\n\t\t\tif (target.socket == null)\n\t\t\t{\n\t\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CouldntFindSocket, false);\n\t\t\t\tConstructionErrors.Log(ownerPlayer, msg.socket.ToString());\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\telse if (target.entity is Door)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.CantDeployOnDoor, false);\n\t\t\treturn;\n\t\t}\n\t}\n\ttarget.ray = msg.ray;\n\ttarget.onTerrain = msg.onterrain;\n\ttarget.position = msg.position;\n\ttarget.normal = msg.normal;\n\ttarget.rotation = msg.rotation;\n\ttarget.player = ownerPlayer;\n\ttarget.isHoldingShift = msg.isHoldingShift;\n\ttarget.isSnapped = msg.isSnapped;\n\ttarget.snappedPosition = msg.snappedPosition;\n\ttarget.snappedRotation = msg.snappedRotation;\n\ttarget.valid = true;\n\tif (Oxide.Core.Interface.CallHook(\"CanBuild\", this, construction, target) != null)\n\t{\n\t\treturn;\n\t}\n\tif (ShouldParent(target.entity, deployable))\n\t{\n\t\tPlayerBoat parentPlayerBoat = PlayerBoat.GetParentPlayerBoat(target.entity, includeEntityItself: true);\n\t\tif (parentPlayerBoat != null && (!parentPlayerBoat.VerifyDeployablePlacement(ownerPlayer) || (!construction.canBypassBuildingPermission && !parentPlayerBoat.IsAuthedForBuilding(ownerPlayer))))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tUnityEngine.Vector3 position = ((target.socket != null) ? target.GetWorldPosition() : target.position);\n\t\tfloat num = target.entity.Distance(position);\n\t\tif (num > 1f)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.ParentTooFar, false);\n\t\t\tConstructionErrors.Log(ownerPlayer, num.ToString());\n\t\t\treturn;\n\t\t}\n\t}\n\tif (!construction.canBypassBuildingPermission && !ownerPlayer.CanBuild())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.NoPermission, false);\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = DoBuild(target, construction);\n\tif (baseEntity != null && baseEntity is DecayEntity decayEntity)\n\t{\n\t\tdecayEntity.timePlaced = GetNetworkTime();\n\t}\n\tif (baseEntity != null && baseEntity is BuildingBlock buildingBlock && ownerPlayer.IsInCreativeMode && ConVar.Creative.freeBuild)\n\t{\n\t\tConstructionGrade constructionGrade = construction.grades[msg.setToGrade];\n\t\tif (buildingBlock.currentGrade != constructionGrade)\n\t\t{\n\t\t\tbuildingBlock.ChangeGradeAndSkin(constructionGrade.gradeBase.type, constructionGrade.gradeBase.skin, playEffect: false, updateSkin: true, null);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Planner planner, UnityEngine.GameObject local2",
      "TargetName": "Planner",
      "MethodName": "DoBuild",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1186965622,
      "Name": "CanAffordToPlace",
      "FullName": "CanAffordToPlace",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "planner",
          "typeName": "Planner",
          "optional": false
        },
        {
          "name": "component",
          "typeName": "Construction",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to afford to place.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanAffordToPlace(Construction component)\n{\n\tif (isTypeDeployable)\n\t{\n\t\treturn true;\n\t}\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAffordToPlace\", ownerPlayer, this, component);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (ownerPlayer.IsInCreativeMode && ConVar.Creative.freeBuild)\n\t{\n\t\treturn true;\n\t}\n\tforeach (ItemAmount item in component.defaultGrade.CostToBuild())\n\t{\n\t\tif ((float)ownerPlayer.inventory.GetAmount(item.itemDef.itemid) < item.amount)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer local0, Planner planner, Construction component",
      "TargetName": "Planner",
      "MethodName": "CanAffordToPlace",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2334791193,
      "Name": "OnConstructionPlace",
      "FullName": "OnConstructionPlace",
      "Category": "Structure",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a construction is placed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public UnityEngine.GameObject DoPlacement(Construction.Target placement, Construction component)\n{\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn null;\n\t}\n\tBaseEntity baseEntity = component.CreateConstruction(placement, bNeedsValidPlacement: true);\n\tif (!baseEntity)\n\t{\n\t\treturn null;\n\t}\n\tfloat num = 1f;\n\tfloat num2 = 0f;\n\tItem ownerItem = GetOwnerItem();\n\tif (ownerItem != null)\n\t{\n\t\tbaseEntity.skinID = ownerItem.skin;\n\t\tif (ownerItem.hasCondition)\n\t\t{\n\t\t\tnum = ownerItem.conditionNormalized;\n\t\t}\n\t}\n\tPoolableEx.AwakeFromInstantiate(baseEntity.gameObject);\n\tBuildingBlock buildingBlock = baseEntity as BuildingBlock;\n\tif ((bool)buildingBlock)\n\t{\n\t\tbuildingBlock.blockDefinition = PrefabAttribute.server.Find<Construction>(buildingBlock.prefabID);\n\t\tif (!buildingBlock.blockDefinition)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(\"Placing a building block that has no block definition!\");\n\t\t\treturn null;\n\t\t}\n\t\tbuildingBlock.SetGrade(buildingBlock.blockDefinition.defaultGrade.gradeBase.type);\n\t}\n\tBaseCombatEntity baseCombatEntity = baseEntity as BaseCombatEntity;\n\tif ((bool)baseCombatEntity)\n\t{\n\t\tnum2 = ((buildingBlock != null) ? buildingBlock.currentGrade.maxHealth : baseCombatEntity.startHealth);\n\t\tbaseCombatEntity.ResetLifeStateOnSpawn = false;\n\t\tbaseCombatEntity.InitializeHealth(num2 * num, baseCombatEntity.StartMaxHealth());\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnConstructionPlace\", baseEntity, component, placement, ownerPlayer) != null)\n\t{\n\t\tif (baseEntity.IsValid())\n\t\t{\n\t\t\tbaseEntity.KillMessage();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDecayEntity decayEntity = baseEntity as DecayEntity;\n\t\t\tif ((bool)decayEntity)\n\t\t\t{\n\t\t\t\tdecayEntity.DoServerDestroy();\n\t\t\t}\n\t\t\tbaseEntity.TerminateOnServer();\n\t\t\tbaseEntity.EntityDestroy();\n\t\t}\n\t\treturn null;\n\t}\n\tbaseEntity.OnPlaced(ownerPlayer);\n\tbaseEntity.OwnerID = ownerPlayer.userID;\n\tbaseEntity.Spawn();\n\tif ((bool)buildingBlock)\n\t{\n\t\tEffect.server.Run(buildingBlock.blockDefinition.placeEffect.isValid ? buildingBlock.blockDefinition.placeEffect.resourcePath : \"assets/bundled/prefabs/fx/build/frame_place.prefab\", baseEntity, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t}\n\tStabilityEntity stabilityEntity = baseEntity as StabilityEntity;\n\tif ((bool)stabilityEntity)\n\t{\n\t\tstabilityEntity.UpdateSurroundingEntities();\n\t}\n\treturn baseEntity.gameObject;\n}\n",
      "ParametersText": "",
      "TargetName": "Planner",
      "MethodName": "DoPlacement",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2876953844,
      "Name": "OnCodeEntered",
      "FullName": "OnCodeEntered",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a code is entered."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\nprivate void UnlockWithCode(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.CanInteract() || !IsLocked() || IsCodeEntryBlocked())\n\t{\n\t\treturn;\n\t}\n\tstring text = rpc.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"OnCodeEntered\", this, rpc.player, text) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = text == guestCode;\n\tbool flag2 = text == code;\n\tif (!(text == code) && (!hasGuestCode || !(text == guestCode)))\n\t{\n\t\tif (UnityEngine.Time.realtimeSinceStartup > lastWrongTime + 60f)\n\t\t{\n\t\t\twrongCodes = 0;\n\t\t}\n\t\tDoEffect(effectDenied.resourcePath);\n\t\tDoEffect(effectShock.resourcePath);\n\t\trpc.player.Hurt((float)(wrongCodes + 1) * 5f, Rust.DamageType.ElectricShock, this, useProtection: false);\n\t\twrongCodes++;\n\t\tif (wrongCodes > 5)\n\t\t{\n\t\t\trpc.player.ShowToast(GameTip.Styles.Red_Normal, blockwarning, false);\n\t\t}\n\t\tif ((float)wrongCodes >= maxFailedAttempts)\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved11, b: true);\n\t\t\tInvoke(ClearCodeEntryBlocked, lockoutCooldown);\n\t\t}\n\t\tlastWrongTime = UnityEngine.Time.realtimeSinceStartup;\n\t\treturn;\n\t}\n\tSendNetworkUpdate();\n\tif (flag2)\n\t{\n\t\tif (!whitelistPlayers.Contains(rpc.player.userID))\n\t\t{\n\t\t\tDoEffect(effectCodeChanged.resourcePath);\n\t\t\twhitelistPlayers.Add(rpc.player.userID);\n\t\t\twrongCodes = 0;\n\t\t\tUpdateParentBox();\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnCodeLockEntered(rpc.player, this, isGuest: false);\n\t}\n\telse if (flag && !guestPlayers.Contains(rpc.player.userID))\n\t{\n\t\tDoEffect(effectCodeChanged.resourcePath);\n\t\tguestPlayers.Add(rpc.player.userID);\n\t\tUpdateParentBox();\n\t\tFacepunch.Rust.Analytics.Azure.OnCodeLockEntered(rpc.player, this, isGuest: true);\n\t}\n}\n",
      "ParametersText": "CodeLock codeLock, BasePlayer player, string local0",
      "TargetName": "CodeLock",
      "MethodName": "UnlockWithCode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2832245565,
      "Name": "OnCodeChanged",
      "FullName": "OnCodeChanged",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "codeLock",
          "typeName": "CodeLock",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a code is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f, CheckParent = true)]\nprivate void RPC_ChangeCode(BaseEntity.RPCMessage rpc)\n{\n\tif (!rpc.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tstring text = rpc.read.String();\n\tbool flag = rpc.read.Bit();\n\tif (!IsLocked() && text.Length == 4 && UnityEngine.StringEx.IsNumeric(text) && !(!hasCode && flag) && Oxide.Core.Interface.CallHook(\"CanChangeCode\", rpc.player, this, text, flag) == null)\n\t{\n\t\tif (!hasCode && !flag)\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Locked, b: true);\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnCodelockChanged(rpc.player, this, flag ? guestCode : code, text, flag);\n\t\tif (!flag)\n\t\t{\n\t\t\tcode = text;\n\t\t\thasCode = code.Length > 0;\n\t\t\twhitelistPlayers.Clear();\n\t\t\twhitelistPlayers.Add(rpc.player.userID);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tguestCode = text;\n\t\t\thasGuestCode = guestCode.Length > 0;\n\t\t\tguestPlayers.Clear();\n\t\t\tguestPlayers.Add(rpc.player.userID);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnCodeChanged\", rpc.player, this, text, flag);\n\t\tDoEffect(effectCodeChanged.resourcePath);\n\t\tSendNetworkUpdate();\n\t\tUpdateParentBox();\n\t}\n}\n",
      "ParametersText": "BasePlayer player, CodeLock codeLock, string local0, bool local1",
      "TargetName": "CodeLock",
      "MethodName": "RPC_ChangeCode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1034394591,
      "Name": "OnBuildingSplit",
      "FullName": "OnBuildingSplit",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "oldBuilding",
          "typeName": "BuildingManager+Building",
          "optional": false
        },
        {
          "name": "newID",
          "typeName": "System.UInt32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when building split occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Split(BuildingManager.Building oldBuilding)\n{\n\tSystem.Collections.Generic.List<BuildingManager.Building> obj = Facepunch.Pool.Get<System.Collections.Generic.List<BuildingManager.Building>>();\n\tBuildingManager.Building largestSplit = null;\n\twhile (oldBuilding.HasBuildingBlocks())\n\t{\n\t\tBuildingBlock buildingBlock = oldBuilding.buildingBlocks[0];\n\t\tuint newID = BuildingManager.server.NewBuildingID();\n\t\tOxide.Core.Interface.CallHook(\"OnBuildingSplit\", oldBuilding, newID);\n\t\tbuildingBlock.EntityLinkBroadcast(delegate(BuildingBlock b)\n\t\t{\n\t\t\tb.AttachToBuilding(newID);\n\t\t});\n\t\tBuildingManager.Building building = BuildingManager.server.GetBuilding(newID);\n\t\tif (building != null)\n\t\t{\n\t\t\tobj.Add(building);\n\t\t}\n\t}\n\tint num = 0;\n\tforeach (BuildingManager.Building item in obj)\n\t{\n\t\tif (item.buildingBlocks.Count > num)\n\t\t{\n\t\t\tnum = item.buildingBlocks.Count;\n\t\t\tlargestSplit = item;\n\t\t}\n\t}\n\tSplitEntities(oldBuilding.buildingPrivileges, largestSplit);\n\tSplitEntities(oldBuilding.decayEntities, largestSplit);\n\tif (ConVar.AI.nav_carve_use_building_optimization)\n\t{\n\t\toldBuilding.isNavMeshCarvingDirty = true;\n\t\tint ticks = 2;\n\t\tUpdateNavMeshCarver(oldBuilding, ref ticks, 0);\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n}\n",
      "ParametersText": "BuildingManager.Building oldBuilding, uint newID",
      "TargetName": "ServerBuildingManager",
      "MethodName": "Split",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3484345190,
      "Name": "OnBuildingMerge",
      "FullName": "OnBuildingMerge",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "serverBuildingManager",
          "typeName": "ServerBuildingManager",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a building merges."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Merge(BuildingManager.Building building1, BuildingManager.Building building2)\n{\n\tOxide.Core.Interface.CallHook(\"OnBuildingMerge\", this, building1, building2);\n\twhile (building2.HasDecayEntities())\n\t{\n\t\tbuilding2.decayEntities[0].AttachToBuilding(building1.ID);\n\t}\n\tif (ConVar.AI.nav_carve_use_building_optimization)\n\t{\n\t\tbuilding1.isNavMeshCarvingDirty = true;\n\t\tbuilding2.isNavMeshCarvingDirty = true;\n\t\tint ticks = 3;\n\t\tUpdateNavMeshCarver(building1, ref ticks, 0);\n\t\tUpdateNavMeshCarver(building1, ref ticks, 0);\n\t}\n}\n",
      "ParametersText": "ServerBuildingManager serverBuildingManager",
      "TargetName": "ServerBuildingManager",
      "MethodName": "Merge",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1270763772,
      "Name": "OnSignLocked",
      "FullName": "OnSignLocked [PhotoFrame]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "photoFrame",
          "typeName": "PhotoFrame",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sign is locked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void LockSign(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && CanUpdateSign(msg.player))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Locked, b: true);\n\t\tSendNetworkUpdate();\n\t\tbase.OwnerID = msg.player.userID;\n\t\tOxide.Core.Interface.CallHook(\"OnSignLocked\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "PhotoFrame photoFrame, BasePlayer player",
      "TargetName": "PhotoFrame",
      "MethodName": "LockSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2635396024,
      "Name": "OnSignUpdated",
      "FullName": "OnSignUpdated [PhotoFrame]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "photoFrame",
          "typeName": "PhotoFrame",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sign is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(5f)]\npublic void UpdateSign(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player == null) && CanUpdateSign(msg.player))\n\t{\n\t\tbyte[] array = msg.read.BytesWithSize();\n\t\tif (array != null && ImageProcessing.IsValidPNG(array, 1024, 1024))\n\t\t{\n\t\t\tFileStorage.server.RemoveAllByEntity(net.ID);\n\t\t\t_overlayTextureCrc = FileStorage.server.Store(array, FileStorage.Type.png, net.ID);\n\t\t\tLogEdit(msg.player);\n\t\t\tSendNetworkUpdate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnSignUpdated\", this, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PhotoFrame photoFrame, BasePlayer player",
      "TargetName": "PhotoFrame",
      "MethodName": "UpdateSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1460091328,
      "Name": "OnCupboardAuthorize",
      "FullName": "OnCupboardAuthorize [ItemModDeployable]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BuildingPrivlidge",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cupboard authorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal void OnDeployed(BaseEntity ent, BasePlayer player)\n{\n\tif (player.IsValid() && !string.IsNullOrEmpty(UnlockAchievement))\n\t{\n\t\tplayer.GiveAchievement(UnlockAchievement);\n\t}\n\tif (ent is BuildingPrivlidge buildingPrivlidge && Oxide.Core.Interface.CallHook(\"OnCupboardAuthorize\", buildingPrivlidge, player) == null)\n\t{\n\t\tbuildingPrivlidge.AddPlayer(player, player.userID);\n\t}\n}\n",
      "ParametersText": "BuildingPrivlidge local0, BasePlayer player",
      "TargetName": "ItemModDeployable",
      "MethodName": "OnDeployed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2635396024,
      "Name": "OnSignUpdated",
      "FullName": "OnSignUpdated [CarvablePumpkin]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "carvablePumpkin",
          "typeName": "CarvablePumpkin",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sign is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(5f)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\npublic void UpdateSign(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player == null || !CanUpdateSign(msg.player))\n\t{\n\t\treturn;\n\t}\n\tint num = msg.read.Int32();\n\tif (num < 0 || num >= paintableSources.Length)\n\t{\n\t\treturn;\n\t}\n\tbyte[] array = msg.read.BytesWithSize();\n\tif (msg.read.Unread > 0 && msg.read.Bit() && !msg.player.IsAdmin)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"{msg.player} tried to upload a sign from a file but they aren't admin, ignoring\");\n\t\treturn;\n\t}\n\tEnsureInitialized();\n\tif (array == null)\n\t{\n\t\tif (textureIDs[num] != 0)\n\t\t{\n\t\t\tFileStorage.server.RemoveExact(textureIDs[num], FileStorage.Type.png, net.ID, (uint)num);\n\t\t}\n\t\ttextureIDs[num] = 0u;\n\t}\n\telse\n\t{\n\t\tif (!ImageProcessing.IsValidPNG(array, 1024, 1024))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (textureIDs[num] != 0)\n\t\t{\n\t\t\tFileStorage.server.RemoveExact(textureIDs[num], FileStorage.Type.png, net.ID, (uint)num);\n\t\t}\n\t\ttextureIDs[num] = FileStorage.server.Store(array, FileStorage.Type.png, net.ID, (uint)num);\n\t}\n\tLogEdit(msg.player);\n\tSendNetworkUpdate();\n\tOxide.Core.Interface.CallHook(\"OnSignUpdated\", this, msg.player);\n}\n",
      "ParametersText": "CarvablePumpkin carvablePumpkin, BasePlayer player",
      "TargetName": "CarvablePumpkin",
      "MethodName": "UpdateSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 640250473,
      "Name": "OnDoorKnocked",
      "FullName": "OnDoorKnocked [DoorKnocker]",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "doorKnocker",
          "typeName": "DoorKnocker",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a door is knocked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Knock(BasePlayer player)\n{\n\tClientRPC(RpcTarget.NetworkGroup(\"ClientKnock\"), player.transform.position);\n\tOxide.Core.Interface.CallHook(\"OnDoorKnocked\", this, player);\n}\n",
      "ParametersText": "DoorKnocker doorKnocker",
      "TargetName": "DoorKnocker",
      "MethodName": "Knock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1350632731,
      "Name": "OnLockerSwap",
      "FullName": "OnLockerSwap",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "locker",
          "typeName": "Locker",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a locker swaps."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_Equip(BaseEntity.RPCMessage msg)\n{\n\tint num = msg.read.Int32();\n\tif (num < 0 || num >= 3 || Oxide.Core.Interface.CallHook(\"OnLockerSwap\", this, num, msg.player) != null || IsEquipping())\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (player.IsDead())\n\t{\n\t\treturn;\n\t}\n\tBaseLock @lock = GetLock();\n\tif (@lock != null && !@lock.OnTryToOpen(player))\n\t{\n\t\tplayer.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.ContainerLocked, false);\n\t\treturn;\n\t}\n\tint startSlot = num * 14;\n\tif (SwapPlayerInventoryWithContainer(player, base.inventory, startSlot, GetDropPosition(), GetDropVelocity(), doBelt: true))\n\t{\n\t\tEffect.server.Run(equipSound.resourcePath, player, StringPool.Get(\"spine3\"), UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\tInvoke(ClearEquipping, 1.5f);\n\t}\n}\n",
      "ParametersText": "Locker locker, int local0, BasePlayer player",
      "TargetName": "Locker",
      "MethodName": "RPC_Equip",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1554325245,
      "Name": "OnPoweredLightsPointAdd",
      "FullName": "OnPoweredLightsPointAdd",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "stringLights",
          "typeName": "StringLights",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a powered lights point is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\npublic void SERVER_AddPoint(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (player != usingPlayer)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 vector = msg.read.Vector3();\n\tUnityEngine.Vector3 vector2 = msg.read.Vector3();\n\tfloat num = msg.read.Float();\n\tif (UnityEngine.Vector3Ex.IsNaNOrInfinity(vector) || UnityEngine.Vector3Ex.IsNaNOrInfinity(vector2) || num.IsNaNOrInfinity())\n\t{\n\t\treturn;\n\t}\n\tnum = UnityEngine.Mathf.Clamp(num, 0f, 2f);\n\tItem item = GetItem();\n\tif (item != null && item.amount >= 1 && CanPlayerUse(player) && !(UnityEngine.Vector3.Distance(vector, player.eyes.position) > maxPlaceDistance) && CheckValidPlacement(vector, 0.1f, 1218510849) && Oxide.Core.Interface.CallHook(\"OnPoweredLightsPointAdd\", this, player, vector, vector2) == null)\n\t{\n\t\tint num2 = 1;\n\t\tfloat num3 = 0f;\n\t\tUnityEngine.Vector3 vector3 = ((points.Count > 0) ? base.transform.TransformPoint(points[points.Count - 1].point) : wireOrigin.position);\n\t\tnum3 = UnityEngine.Vector3.Distance(vector, vector3);\n\t\tnum3 = UnityEngine.Mathf.Max(num3, lengthPerAmount);\n\t\tfloat num4 = (float)item.amount * lengthPerAmount;\n\t\tif (player.IsInCreativeMode && ConVar.Creative.unlimitedIo)\n\t\t{\n\t\t\tnum4 = 200f;\n\t\t}\n\t\tif (num3 > num4)\n\t\t{\n\t\t\tnum3 = num4;\n\t\t\tvector = vector3 + UnityEngine.Vector3Ex.Direction(vector, vector3) * num3;\n\t\t}\n\t\tnum3 = UnityEngine.Mathf.Min(num4, num3);\n\t\tnum2 = UnityEngine.Mathf.CeilToInt(num3 / lengthPerAmount);\n\t\tif (player.IsInCreativeMode && ConVar.Creative.unlimitedIo)\n\t\t{\n\t\t\tnum2 = 0;\n\t\t}\n\t\tAddPoint(base.transform.InverseTransformPoint(vector), base.transform.InverseTransformDirection(vector2), num);\n\t\tUseItemAmount(num2);\n\t\tAddLengthUsed(num2);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "StringLights stringLights, BasePlayer local0, UnityEngine.Vector3 local1, UnityEngine.Vector3 local2",
      "TargetName": "StringLights",
      "MethodName": "SERVER_AddPoint",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3609197098,
      "Name": "OnSignContentCopied",
      "FullName": "OnSignContentCopied",
      "Category": "Structure",
      "Parameters": [
        {
          "name": "signContent",
          "typeName": "SignContent",
          "optional": false
        },
        {
          "name": "s",
          "typeName": "ISignage",
          "optional": false
        },
        {
          "name": "b",
          "typeName": "IUGCBrowserEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a sign content is copied."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void CopyInfoToSign(ISignage s, IUGCBrowserEntity b)\n{\n\tFileStorage.server.ReassignEntityId(net.ID, s.NetworkID);\n\ts.SetTextureCRCs(textureIDs);\n\tb.EditingHistory.Clear();\n\tforeach (ulong item in editHistory)\n\t{\n\t\tb.EditingHistory.Add(item);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnSignContentCopied\", this, s, b);\n}\n",
      "ParametersText": "SignContent signContent, ISignage s, IUGCBrowserEntity b",
      "TargetName": "SignContent",
      "MethodName": "CopyInfoToSign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Vending": [
    {
      "Id": 2145652880,
      "Name": "OnMarketplaceTerminalPurchase",
      "FullName": "OnMarketplaceTerminalPurchase",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "terminal",
          "typeName": "MarketTerminal",
          "optional": false
        },
        {
          "name": "vending",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "sellOrderIndex",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "amount",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a marketplace terminal is purchased."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": false,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(10uL)]\npublic void Server_Purchase(BaseEntity.RPCMessage msg)\n{\n\tif (!CanPlayerInteract(msg.player))\n\t{\n\t\treturn;\n\t}\n\tif (!_marketplace.IsValid(serverside: true))\n\t{\n\t\tUnityEngine.Debug.LogError(\"Marketplace is not set\", this);\n\t\treturn;\n\t}\n\tNetworkableId networkableId = msg.read.EntityID();\n\tint num = msg.read.Int32();\n\tint num2 = msg.read.Int32();\n\tVendingMachine vendingMachine = BaseNetworkable.serverEntities.Find(networkableId) as VendingMachine;\n\tif (vendingMachine == null || !vendingMachine.IsValid() || num < 0 || num >= vendingMachine.sellOrders.sellOrders.Count || num2 <= 0 || base.inventory.IsFull())\n\t{\n\t\treturn;\n\t}\n\tGetDeliveryEligibleVendingMachines(null);\n\tif (_deliveryEligible == null || !_deliveryEligible.Contains(networkableId))\n\t{\n\t\treturn;\n\t}\n\ttry\n\t{\n\t\t_transactionActive = true;\n\t\tint num3 = deliveryFeeAmount;\n\t\tProtoBuf.VendingMachine.SellOrder sellOrder = vendingMachine.sellOrders.sellOrders[num];\n\t\tif (!CanPlayerAffordOrderAndDeliveryFee(msg.player, sellOrder, num2))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint? slotsRequiredForTransaction = vendingMachine.GetSlotsRequiredForTransaction(num, num2);\n\t\tif (slotsRequiredForTransaction.HasValue && !CheckItem.CanFitSimple(base.inventory, slotsRequiredForTransaction.Value))\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Red_Normal, _cantFitPhrase, true);\n\t\t\treturn;\n\t\t}\n\t\tint num4 = msg.player.inventory.Take(null, deliveryFeeCurrency.itemid, num3);\n\t\tif (num4 != num3)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError($\"Took an incorrect number of items for the delivery fee (took {num4}, should have taken {num3})\");\n\t\t}\n\t\tClientRPC(RpcTarget.Player(\"Client_ShowItemNotice\", msg.player), deliveryFeeCurrency.itemid, -num3, arg3: false);\n\t\tif (!vendingMachine.DoTransaction(msg.player, num, num2, base.inventory, _onCurrencyRemovedCached, _onItemPurchasedCached, this))\n\t\t{\n\t\t\tItem item = ItemManager.CreateByItemID(deliveryFeeCurrency.itemid, num3, 0uL);\n\t\t\tif (!msg.player.inventory.GiveItem(item))\n\t\t\t{\n\t\t\t\titem.Drop(msg.player.inventory.containerMain.dropPosition, msg.player.inventory.containerMain.dropVelocity);\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tRestrictToPlayer(msg.player);\n\t\t\tRegisterOrder(msg.player, vendingMachine);\n\t\t}\n\t}\n\tfinally\n\t{\n\t\t_transactionActive = false;\n\t}\n}\n",
      "ParametersText": "MarketTerminal terminal, VendingMachine vending, BasePlayer player, int sellOrderIndex, int amount",
      "TargetName": "MarketTerminal",
      "MethodName": "Server_Purchase",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2954685032,
      "Name": "OnBuyVendingItem",
      "FullName": "OnBuyVendingItem",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when buy vending item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\npublic void BuyItem(BaseEntity.RPCMessage rpc)\n{\n\tif (!OccupiedCheck(rpc.player))\n\t{\n\t\treturn;\n\t}\n\tint num = rpc.read.Int32();\n\tint num2 = rpc.read.Int32();\n\tif (IsVending())\n\t{\n\t\trpc.player.ShowToast(GameTip.Styles.Red_Normal, WaitForVendingMessage, false);\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnBuyVendingItem\", this, rpc.player, num, num2) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint num3 = 0;\n\t\tfor (int i = 0; i < sellOrders.sellOrders.Count; i++)\n\t\t{\n\t\t\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(sellOrders.sellOrders[i].itemToSellID);\n\t\t\tItemDefinition itemDefinition2 = ItemManager.FindItemDefinition(sellOrders.sellOrders[i].currencyID);\n\t\t\tif (itemDefinition.IsAllowed(CurrentEraRestriction) && itemDefinition2.IsAllowed(CurrentEraRestriction))\n\t\t\t{\n\t\t\t\tif (num3 == num)\n\t\t\t\t{\n\t\t\t\t\tnum = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tnum3++;\n\t\t\t}\n\t\t}\n\t\tSetPendingOrder(rpc.player, num, num2);\n\t\tInvoke(CompletePendingOrder, GetBuyDuration());\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer player, int local0, int local1",
      "TargetName": "VendingMachine",
      "MethodName": "BuyItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1307174715,
      "Name": "CanUseVending",
      "FullName": "CanUseVending",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use vending.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool CanOpenLootPanel(BasePlayer player, string panelName)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseVending\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (panelName == customerPanel)\n\t{\n\t\treturn true;\n\t}\n\tif (base.CanOpenLootPanel(player, panelName))\n\t{\n\t\treturn CanPlayerAdmin(player);\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, VendingMachine vendingMachine",
      "TargetName": "VendingMachine",
      "MethodName": "CanOpenLootPanel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3072084583,
      "Name": "CanAdministerVending",
      "FullName": "CanAdministerVending",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to administer vending.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanPlayerAdmin(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAdministerVending\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (PlayerBehind(player))\n\t{\n\t\treturn OccupiedCheck(player);\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, VendingMachine vendingMachine",
      "TargetName": "VendingMachine",
      "MethodName": "CanPlayerAdmin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1089385978,
      "Name": "OnRefreshVendingStock",
      "FullName": "OnRefreshVendingStock",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "itemDef",
          "typeName": "ItemDefinition",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when refresh vending stock occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RefreshSellOrderStockLevel(ItemDefinition itemDef = null)\n{\n\tint num = 0;\n\tforeach (ProtoBuf.VendingMachine.SellOrder sellOrder in sellOrders.sellOrders)\n\t{\n\t\tif (!(itemDef == null) && itemDef.itemid != sellOrder.itemToSellID)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tSystem.Collections.Generic.List<Item> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Item>>();\n\t\tGetItemsToSell(sellOrder, obj);\n\t\tint num2 = sellOrder.itemToSellAmount;\n\t\tif (ItemManager.FindItemDefinition(sellOrder.itemToSellID) == NPCVendingMachine.ScrapItem && sellOrder.receivedQuantityMultiplier != 1f)\n\t\t{\n\t\t\tnum2 = GetTotalPriceForOrder(num2, sellOrder.receivedQuantityMultiplier);\n\t\t}\n\t\tint inStock;\n\t\tif (obj.Count < 0)\n\t\t{\n\t\t\tinStock = 0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tSystem.Collections.Generic.List<Item> source = obj;\n\t\t\tSystem.Func<Item, int> selector = (Item x) => x.amount;\n\t\t\tOxide.Core.Interface.CallHook(\"OnRefreshVendingStock\", this, itemDef);\n\t\t\tinStock = System.Linq.Enumerable.Sum(source, selector) / num2;\n\t\t}\n\t\tsellOrder.inStock = inStock;\n\t\tfloat itemCondition = 0f;\n\t\tfloat itemConditionMax = 0f;\n\t\tint instanceData = 0;\n\t\tSystem.Collections.Generic.List<int> list = Facepunch.Pool.Get<System.Collections.Generic.List<int>>();\n\t\tint totalAttachmentSlots = 0;\n\t\tint ammoType = 0;\n\t\tint ammoCount = 0;\n\t\tif (obj.Count > 0)\n\t\t{\n\t\t\tif (obj[0].hasCondition)\n\t\t\t{\n\t\t\t\titemCondition = obj[0].condition;\n\t\t\t\titemConditionMax = obj[0].maxCondition;\n\t\t\t}\n\t\t\tif (obj[0].info != null && (obj[0].info.amountType == ItemDefinition.AmountType.Genetics || obj[0].info.amountType == ItemDefinition.AmountType.NucleusGrades) && obj[0].instanceData != null)\n\t\t\t{\n\t\t\t\tinstanceData = obj[0].instanceData.dataInt;\n\t\t\t\tsellOrder.inStock = obj[0].amount;\n\t\t\t}\n\t\t\tif (obj[0].contents != null && obj[0].contents.capacity > 0 && obj[0].contents.HasFlag(ItemContainer.Flag.ShowSlotsOnIcon))\n\t\t\t{\n\t\t\t\tforeach (Item item in obj[0].contents.itemList)\n\t\t\t\t{\n\t\t\t\t\tlist.Add(item.info.itemid);\n\t\t\t\t}\n\t\t\t\ttotalAttachmentSlots = obj[0].contents.capacity;\n\t\t\t}\n\t\t\tif (obj[0].GetHeldEntity() is BaseProjectile { primaryMagazine: not null } baseProjectile)\n\t\t\t{\n\t\t\t\tammoCount = baseProjectile.primaryMagazine.contents;\n\t\t\t\tif (baseProjectile.primaryMagazine.ammoType != null)\n\t\t\t\t{\n\t\t\t\t\tammoType = baseProjectile.primaryMagazine.ammoType.itemid;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tsellOrder.ammoType = ammoType;\n\t\tsellOrder.ammoCount = ammoCount;\n\t\tsellOrder.itemCondition = itemCondition;\n\t\tsellOrder.itemConditionMax = itemConditionMax;\n\t\tsellOrder.instanceData = instanceData;\n\t\tif (sellOrder.attachmentsList != null)\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref sellOrder.attachmentsList);\n\t\t}\n\t\tsellOrder.attachmentsList = list;\n\t\tsellOrder.totalAttachmentSlots = totalAttachmentSlots;\n\t\tsellOrder.priceMultiplier = GetDiscountForSlot(num, sellOrder);\n\t\tsellOrder.receivedQuantityMultiplier = GetReceivedQuantityMultiplier(num, sellOrder);\n\t\tnum++;\n\t\tFacepunch.Pool.Free(ref obj, freeElements: false);\n\t}\n\tSetFlag(BaseEntity.Flags.Reserved5, OutOfStock());\n}\n",
      "ParametersText": "VendingMachine vendingMachine, ItemDefinition itemDef",
      "TargetName": "VendingMachine",
      "MethodName": "RefreshSellOrderStockLevel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2821238809,
      "Name": "OnToggleVendingBroadcast",
      "FullName": "OnToggleVendingBroadcast",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when toggle vending broadcast occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_Broadcast(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tbool b = msg.read.Bit();\n\tif (CanPlayerAdmin(player))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved4, b);\n\t\tOxide.Core.Interface.CallHook(\"OnToggleVendingBroadcast\", this, player);\n\t\tUpdateMapMarker();\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer local0",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_Broadcast",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1045055657,
      "Name": "OnDeleteVendingOffer",
      "FullName": "OnDeleteVendingOffer",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when delete vending offer occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_DeleteSellOrder(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (CanPlayerAdmin(player))\n\t{\n\t\tint num = msg.read.Int32();\n\t\tOxide.Core.Interface.CallHook(\"OnDeleteVendingOffer\", this, num);\n\t\tif (num >= 0 && num < sellOrders.sellOrders.Count)\n\t\t{\n\t\t\tProtoBuf.VendingMachine.SellOrder sellOrder = sellOrders.sellOrders[num];\n\t\t\tFacepunch.Rust.Analytics.Azure.OnVendingMachineOrderChanged(msg.player, this, sellOrder.itemToSellID, sellOrder.itemToSellAmount, sellOrder.itemToSellIsBP, sellOrder.currencyID, sellOrder.currencyAmountPerItem, sellOrder.currencyIsBP, added: false);\n\t\t\tsellOrders.sellOrders.RemoveAt(num);\n\t\t}\n\t\tRefreshSellOrderStockLevel();\n\t\tUpdateMapMarker();\n\t\tSendSellOrders(player);\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, int local1",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_DeleteSellOrder",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 130032208,
      "Name": "OnOpenVendingAdmin",
      "FullName": "OnOpenVendingAdmin",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when open vending admin occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_OpenAdmin(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (CanPlayerAdmin(player))\n\t{\n\t\tOpenShop(player);\n\t\tClientRPC(RpcTarget.Player(\"CLIENT_OpenAdminMenu\", player));\n\t\tOxide.Core.Interface.CallHook(\"OnOpenVendingAdmin\", this, player);\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer local0",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_OpenAdmin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1029092944,
      "Name": "OnVendingShopOpen",
      "FullName": "OnVendingShopOpen [VendingMachine]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vending shop is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_OpenShop(BaseEntity.RPCMessage msg)\n{\n\tif (OccupiedCheck(msg.player) && Oxide.Core.Interface.CallHook(\"OnVendingShopOpen\", this, msg.player) == null)\n\t{\n\t\tOpenShop(msg.player);\n\t\tOxide.Core.Interface.CallHook(\"OnVendingShopOpened\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer player",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_OpenShop",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3251770984,
      "Name": "OnRotateVendingMachine",
      "FullName": "OnRotateVendingMachine",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when rotate vending machine occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_RotateVM(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnRotateVendingMachine\", this, msg.player) == null && CanRotate())\n\t{\n\t\tUpdateEmptyFlag();\n\t\tif (msg.player.CanBuild() && IsInventoryEmpty())\n\t\t{\n\t\t\tbase.transform.rotation = UnityEngine.Quaternion.LookRotation(-base.transform.forward, base.transform.up);\n\t\t\tSendNetworkUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer player",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_RotateVM",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4058960600,
      "Name": "CanVendingAcceptItem",
      "FullName": "CanVendingAcceptItem",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to vending accept item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanAcceptItem(Item item, int targetSlot)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanVendingAcceptItem\", this, item, targetSlot);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tBasePlayer basePlayer = item.GetRootContainer()?.GetOwnerPlayer();\n\tif (transactionActive || industrialItemIncoming)\n\t{\n\t\treturn true;\n\t}\n\tif (item.parent == null)\n\t{\n\t\treturn true;\n\t}\n\tif (base.inventory.itemList.Contains(item))\n\t{\n\t\treturn true;\n\t}\n\tif (basePlayer == null)\n\t{\n\t\treturn item.GetEntityOwner() is ContainerCorpse;\n\t}\n\treturn CanPlayerAdmin(basePlayer);\n}\n",
      "ParametersText": "VendingMachine vendingMachine",
      "TargetName": "VendingMachine",
      "MethodName": "CanAcceptItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 4219534513,
      "Name": "OnAddVendingOffer",
      "FullName": "OnAddVendingOffer",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "ProtoBuf.VendingMachine+SellOrder",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when add vending offer occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AddSellOrder(int itemToSellID, int itemToSellAmount, int currencyToUseID, int currencyAmount, byte bpState, ulong sellSkinId = 0uL, ulong costSkinId = 0uL)\n{\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(itemToSellID);\n\tItemDefinition itemDefinition2 = ItemManager.FindItemDefinition(currencyToUseID);\n\tif (!(itemDefinition == null) && !(itemDefinition2 == null))\n\t{\n\t\tcurrencyAmount = UnityEngine.Mathf.Clamp(currencyAmount, 1, 10000);\n\t\titemToSellAmount = UnityEngine.Mathf.Clamp(itemToSellAmount, 1, itemDefinition.stackable);\n\t\tProtoBuf.VendingMachine.SellOrder sellOrder = new ProtoBuf.VendingMachine.SellOrder();\n\t\tsellOrder.ShouldPool = false;\n\t\tsellOrder.itemToSellID = itemToSellID;\n\t\tsellOrder.itemToSellAmount = itemToSellAmount;\n\t\tsellOrder.currencyID = currencyToUseID;\n\t\tsellOrder.currencyAmountPerItem = currencyAmount;\n\t\tsellOrder.currencyIsBP = bpState == 3 || bpState == 2;\n\t\tsellOrder.itemToSellIsBP = bpState == 3 || bpState == 1;\n\t\tsellOrder.sellSkinId = sellSkinId;\n\t\tsellOrder.costSkinId = costSkinId;\n\t\tOxide.Core.Interface.CallHook(\"OnAddVendingOffer\", this, sellOrder);\n\t\tsellOrders.sellOrders.Add(sellOrder);\n\t\tRefreshSellOrderStockLevel(itemDefinition);\n\t\tUpdateMapMarker();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, ProtoBuf.VendingMachine.SellOrder local2",
      "TargetName": "VendingMachine",
      "MethodName": "AddSellOrder",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 42703263,
      "Name": "OnGiveSoldItem",
      "FullName": "OnGiveSoldItem",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "soldItem",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "buyer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when give sold item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void GiveSoldItem(Item soldItem, BasePlayer buyer)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnGiveSoldItem\", this, soldItem, buyer) == null)\n\t{\n\t\twhile (soldItem.amount > soldItem.MaxStackable())\n\t\t{\n\t\t\tItem item = soldItem.SplitItem(soldItem.MaxStackable());\n\t\t\tbuyer.GiveItem(item, BaseEntity.GiveItemReason.PickedUp);\n\t\t}\n\t\tbuyer.GiveItem(soldItem, BaseEntity.GiveItemReason.PickedUp);\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, Item soldItem, BasePlayer buyer",
      "TargetName": "VendingMachine",
      "MethodName": "GiveSoldItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3675496111,
      "Name": "OnVendingShopRename",
      "FullName": "OnVendingShopRename",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when vending shop rename occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_UpdateShopName(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tstring obj = msg.read.String(32);\n\tif (CanPlayerAdmin(player))\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnVendingShopRename\", this, obj, player) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tshopName = obj;\n\t\tnameLastEditedBy = player.userID.Get();\n\t\tUpdateMapMarker();\n\t}\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "VendingMachine vendingMachine, string local1, BasePlayer local0",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_UpdateShopName",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 819770087,
      "Name": "OnTakeCurrencyItem",
      "FullName": "OnTakeCurrencyItem",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "takenCurrencyItem",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when take currency item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void TakeCurrencyItem(Item takenCurrencyItem)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnTakeCurrencyItem\", this, takenCurrencyItem) == null && !takenCurrencyItem.MoveToContainer(base.inventory))\n\t{\n\t\ttakenCurrencyItem.Drop(base.inventory.dropPosition, UnityEngine.Vector3.zero);\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, Item takenCurrencyItem",
      "TargetName": "VendingMachine",
      "MethodName": "TakeCurrencyItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 101737999,
      "Name": "OnVendingTransaction",
      "FullName": "OnVendingTransaction",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "buyer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "sellOrderId",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "numberOfTransactions",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "targetContainer",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when vending transaction occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool DoTransaction(BasePlayer buyer, int sellOrderId, int numberOfTransactions = 1, ItemContainer targetContainer = null, System.Action<BasePlayer, Item> onCurrencyRemoved = null, System.Action<BasePlayer, Item> onItemPurchased = null, MarketTerminal droneMarketTerminal = null)\n{\n\tif (sellOrderId < 0 || sellOrderId >= sellOrders.sellOrders.Count)\n\t{\n\t\treturn false;\n\t}\n\tif (targetContainer == null && UnityEngine.Vector3.Distance(buyer.transform.position, base.transform.position) > 4f)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnVendingTransaction\", this, buyer, sellOrderId, numberOfTransactions, targetContainer);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tProtoBuf.VendingMachine.SellOrder sellOrder = sellOrders.sellOrders[sellOrderId];\n\tSystem.Collections.Generic.List<Item> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<Item>>();\n\tGetItemsToSell(sellOrder, obj2);\n\tif (obj2 == null || obj2.Count == 0)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\tnumberOfTransactions = UnityEngine.Mathf.Clamp(numberOfTransactions, 1, obj2[0].hasCondition ? 1 : 1000000);\n\tint num = sellOrder.itemToSellAmount * numberOfTransactions;\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(sellOrder.itemToSellID);\n\tItemDefinition itemDefinition2 = ItemManager.FindItemDefinition(sellOrder.currencyID);\n\tif (!itemDefinition.IsAllowed(CurrentEraRestriction) || !itemDefinition2.IsAllowed(CurrentEraRestriction))\n\t{\n\t\treturn false;\n\t}\n\tif (itemDefinition == NPCVendingMachine.ScrapItem && sellOrder.receivedQuantityMultiplier != 1f)\n\t{\n\t\tnum = GetTotalReceivedMerchandiseForOrder(sellOrder.itemToSellAmount, sellOrder.receivedQuantityMultiplier) * numberOfTransactions;\n\t}\n\tint num2 = System.Linq.Enumerable.Sum(obj2, (Item x) => x.amount);\n\tif (num > num2)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\tint num3 = 0;\n\tusing PooledList<Item> pooledList2 = Facepunch.Pool.Get<PooledList<Item>>();\n\tusing (PooledList<Item> pooledList = Facepunch.Pool.Get<PooledList<Item>>())\n\t{\n\t\tbuyer.inventory.FindItemsByItemID(pooledList, sellOrder.currencyIsBP ? blueprintBaseDef.itemid : sellOrder.currencyID);\n\t\tfor (int i = 0; i < pooledList.Count; i++)\n\t\t{\n\t\t\tItem item = pooledList[i];\n\t\t\tif ((!sellOrder.currencyIsBP || item.blueprintTarget == sellOrder.currencyID) && (sellOrder.costSkinId == 0L || item.skin == sellOrder.costSkinId) && (!item.hasCondition || (item.conditionNormalized >= 0.5f && item.maxConditionNormalized > 0.5f)) && item.GetItemVolume() <= maxCurrencyVolume)\n\t\t\t{\n\t\t\t\tpooledList2.Add(item);\n\t\t\t\tnum3 += item.amount;\n\t\t\t}\n\t\t}\n\t}\n\tif (pooledList2.Count == 0)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\tint num4 = GetTotalPriceForOrder(sellOrder) * numberOfTransactions;\n\tif (num3 < num4)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\ttransactionActive = true;\n\tint num5 = 0;\n\tfor (int j = 0; j < pooledList2.Count; j++)\n\t{\n\t\tItem item2 = pooledList2[j];\n\t\tint num6 = UnityEngine.Mathf.Min(num4 - num5, item2.amount);\n\t\tItem item3 = ((item2.amount > num6) ? item2.SplitItem(num6) : item2);\n\t\tTakeCurrencyItem(item3);\n\t\tonCurrencyRemoved?.Invoke(buyer, item3);\n\t\tnum5 += num6;\n\t\tif (num5 >= num4)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tint num7 = 0;\n\tforeach (Item item5 in obj2)\n\t{\n\t\tint num8 = num - num7;\n\t\tItem item4 = ((item5.amount > num8) ? item5.SplitItem(num8) : item5);\n\t\tif (item4 == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(\"Vending machine error, contact developers!\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnum7 += item4.amount;\n\t\t\tobject obj3 = Oxide.Core.Interface.CallHook(\"CanPurchaseItem\", buyer, item4, onItemPurchased, this, targetContainer);\n\t\t\tif (obj3 != null)\n\t\t\t{\n\t\t\t\tif (!(obj3 is bool))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn (bool)obj3;\n\t\t\t}\n\t\t\tRecordSaleAnalytics(item4, sellOrderId, sellOrder.currencyAmountPerItem);\n\t\t\tif (targetContainer == null)\n\t\t\t{\n\t\t\t\tGiveSoldItem(item4, buyer);\n\t\t\t}\n\t\t\telse if (!item4.MoveToContainer(targetContainer))\n\t\t\t{\n\t\t\t\titem4.Drop(targetContainer.dropPosition, targetContainer.dropVelocity);\n\t\t\t}\n\t\t\tif (ShouldRecordStats)\n\t\t\t{\n\t\t\t\tRegisterCustomer(buyer.userID);\n\t\t\t}\n\t\t\tonItemPurchased?.Invoke(buyer, item4);\n\t\t}\n\t\tif (num7 >= num)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnBuyFromVendingMachine(buyer, this, sellOrder.itemToSellID, num, sellOrder.itemToSellIsBP, sellOrder.currencyID, num5, sellOrder.currencyIsBP, numberOfTransactions, sellOrder.priceMultiplier, droneMarketTerminal);\n\tif (ShouldRecordStats)\n\t{\n\t\tAddPurchaseHistory(sellOrder.itemToSellID, num, sellOrder.currencyID, num5, sellOrder.itemToSellIsBP, sellOrder.currencyIsBP);\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\tUpdateEmptyFlag();\n\ttransactionActive = false;\n\treturn true;\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer buyer, int sellOrderId, int numberOfTransactions, ItemContainer targetContainer",
      "TargetName": "VendingMachine",
      "MethodName": "DoTransaction",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3418689761,
      "Name": "CanPurchaseItem",
      "FullName": "CanPurchaseItem",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "buyer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local21",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "onItemPurchased",
          "typeName": "System.Action`2[BasePlayer,Item]",
          "optional": false
        },
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "targetContainer",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to purchase item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool DoTransaction(BasePlayer buyer, int sellOrderId, int numberOfTransactions = 1, ItemContainer targetContainer = null, System.Action<BasePlayer, Item> onCurrencyRemoved = null, System.Action<BasePlayer, Item> onItemPurchased = null, MarketTerminal droneMarketTerminal = null)\n{\n\tif (sellOrderId < 0 || sellOrderId >= sellOrders.sellOrders.Count)\n\t{\n\t\treturn false;\n\t}\n\tif (targetContainer == null && UnityEngine.Vector3.Distance(buyer.transform.position, base.transform.position) > 4f)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnVendingTransaction\", this, buyer, sellOrderId, numberOfTransactions, targetContainer);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tProtoBuf.VendingMachine.SellOrder sellOrder = sellOrders.sellOrders[sellOrderId];\n\tSystem.Collections.Generic.List<Item> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<Item>>();\n\tGetItemsToSell(sellOrder, obj2);\n\tif (obj2 == null || obj2.Count == 0)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\tnumberOfTransactions = UnityEngine.Mathf.Clamp(numberOfTransactions, 1, obj2[0].hasCondition ? 1 : 1000000);\n\tint num = sellOrder.itemToSellAmount * numberOfTransactions;\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(sellOrder.itemToSellID);\n\tItemDefinition itemDefinition2 = ItemManager.FindItemDefinition(sellOrder.currencyID);\n\tif (!itemDefinition.IsAllowed(CurrentEraRestriction) || !itemDefinition2.IsAllowed(CurrentEraRestriction))\n\t{\n\t\treturn false;\n\t}\n\tif (itemDefinition == NPCVendingMachine.ScrapItem && sellOrder.receivedQuantityMultiplier != 1f)\n\t{\n\t\tnum = GetTotalReceivedMerchandiseForOrder(sellOrder.itemToSellAmount, sellOrder.receivedQuantityMultiplier) * numberOfTransactions;\n\t}\n\tint num2 = System.Linq.Enumerable.Sum(obj2, (Item x) => x.amount);\n\tif (num > num2)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\tint num3 = 0;\n\tusing PooledList<Item> pooledList2 = Facepunch.Pool.Get<PooledList<Item>>();\n\tusing (PooledList<Item> pooledList = Facepunch.Pool.Get<PooledList<Item>>())\n\t{\n\t\tbuyer.inventory.FindItemsByItemID(pooledList, sellOrder.currencyIsBP ? blueprintBaseDef.itemid : sellOrder.currencyID);\n\t\tfor (int i = 0; i < pooledList.Count; i++)\n\t\t{\n\t\t\tItem item = pooledList[i];\n\t\t\tif ((!sellOrder.currencyIsBP || item.blueprintTarget == sellOrder.currencyID) && (sellOrder.costSkinId == 0L || item.skin == sellOrder.costSkinId) && (!item.hasCondition || (item.conditionNormalized >= 0.5f && item.maxConditionNormalized > 0.5f)) && item.GetItemVolume() <= maxCurrencyVolume)\n\t\t\t{\n\t\t\t\tpooledList2.Add(item);\n\t\t\t\tnum3 += item.amount;\n\t\t\t}\n\t\t}\n\t}\n\tif (pooledList2.Count == 0)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\tint num4 = GetTotalPriceForOrder(sellOrder) * numberOfTransactions;\n\tif (num3 < num4)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\treturn false;\n\t}\n\ttransactionActive = true;\n\tint num5 = 0;\n\tfor (int j = 0; j < pooledList2.Count; j++)\n\t{\n\t\tItem item2 = pooledList2[j];\n\t\tint num6 = UnityEngine.Mathf.Min(num4 - num5, item2.amount);\n\t\tItem item3 = ((item2.amount > num6) ? item2.SplitItem(num6) : item2);\n\t\tTakeCurrencyItem(item3);\n\t\tonCurrencyRemoved?.Invoke(buyer, item3);\n\t\tnum5 += num6;\n\t\tif (num5 >= num4)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tint num7 = 0;\n\tforeach (Item item5 in obj2)\n\t{\n\t\tint num8 = num - num7;\n\t\tItem item4 = ((item5.amount > num8) ? item5.SplitItem(num8) : item5);\n\t\tif (item4 == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(\"Vending machine error, contact developers!\");\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnum7 += item4.amount;\n\t\t\tobject obj3 = Oxide.Core.Interface.CallHook(\"CanPurchaseItem\", buyer, item4, onItemPurchased, this, targetContainer);\n\t\t\tif (obj3 != null)\n\t\t\t{\n\t\t\t\tif (!(obj3 is bool))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn (bool)obj3;\n\t\t\t}\n\t\t\tRecordSaleAnalytics(item4, sellOrderId, sellOrder.currencyAmountPerItem);\n\t\t\tif (targetContainer == null)\n\t\t\t{\n\t\t\t\tGiveSoldItem(item4, buyer);\n\t\t\t}\n\t\t\telse if (!item4.MoveToContainer(targetContainer))\n\t\t\t{\n\t\t\t\titem4.Drop(targetContainer.dropPosition, targetContainer.dropVelocity);\n\t\t\t}\n\t\t\tif (ShouldRecordStats)\n\t\t\t{\n\t\t\t\tRegisterCustomer(buyer.userID);\n\t\t\t}\n\t\t\tonItemPurchased?.Invoke(buyer, item4);\n\t\t}\n\t\tif (num7 >= num)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnBuyFromVendingMachine(buyer, this, sellOrder.itemToSellID, num, sellOrder.itemToSellIsBP, sellOrder.currencyID, num5, sellOrder.currencyIsBP, numberOfTransactions, sellOrder.priceMultiplier, droneMarketTerminal);\n\tif (ShouldRecordStats)\n\t{\n\t\tAddPurchaseHistory(sellOrder.itemToSellID, num, sellOrder.currencyID, num5, sellOrder.itemToSellIsBP, sellOrder.currencyIsBP);\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\tUpdateEmptyFlag();\n\ttransactionActive = false;\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer buyer, Item local21, System.Action`2[BasePlayer,Item] onItemPurchased, VendingMachine vendingMachine, ItemContainer targetContainer",
      "TargetName": "VendingMachine",
      "MethodName": "DoTransaction",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 397104876,
      "Name": "OnVendingShopOpened",
      "FullName": "OnVendingShopOpened [VendingMachine]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vending shop is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_OpenShop(BaseEntity.RPCMessage msg)\n{\n\tif (OccupiedCheck(msg.player) && Oxide.Core.Interface.CallHook(\"OnVendingShopOpen\", this, msg.player) == null)\n\t{\n\t\tOpenShop(msg.player);\n\t\tOxide.Core.Interface.CallHook(\"OnVendingShopOpened\", this, msg.player);\n\t}\n}\n",
      "ParametersText": "VendingMachine vendingMachine, BasePlayer player",
      "TargetName": "VendingMachine",
      "MethodName": "RPC_OpenShop",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3072084583,
      "Name": "CanAdministerVending",
      "FullName": "CanAdministerVending [NPC]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "nPCVendingMachine",
          "typeName": "NPCVendingMachine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to administer vending.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool CanPlayerAdmin(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAdministerVending\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "BasePlayer player, NPCVendingMachine nPCVendingMachine",
      "TargetName": "NPCVendingMachine",
      "MethodName": "CanPlayerAdmin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 819770087,
      "Name": "OnTakeCurrencyItem",
      "FullName": "OnTakeCurrencyItem [NPC]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "nPCVendingMachine",
          "typeName": "NPCVendingMachine",
          "optional": false
        },
        {
          "name": "takenCurrencyItem",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when take currency item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void TakeCurrencyItem(Item takenCurrencyItem)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnTakeCurrencyItem\", this, takenCurrencyItem) == null)\n\t{\n\t\ttakenCurrencyItem.MoveToContainer(base.inventory);\n\t\ttakenCurrencyItem.RemoveFromContainer();\n\t\ttakenCurrencyItem.Remove();\n\t}\n}\n",
      "ParametersText": "NPCVendingMachine nPCVendingMachine, Item takenCurrencyItem",
      "TargetName": "NPCVendingMachine",
      "MethodName": "TakeCurrencyItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1949289818,
      "Name": "CanAccessVendingMachine",
      "FullName": "CanAccessVendingMachine",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "marketTerminal",
          "typeName": "MarketTerminal",
          "optional": false
        },
        {
          "name": "vendingMachine",
          "typeName": "VendingMachine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to access vending machine.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[System.Runtime.CompilerServices.CompilerGenerated]\nprivate bool <GetDeliveryEligibleVendingMachines>g__IsEligible|43_0(VendingMachine vendingMachine, UnityEngine.Vector3 offset, int n)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAccessVendingMachine\", config, vendingMachine);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (vendingMachine.IsInDeepSeaCached)\n\t{\n\t\treturn false;\n\t}\n\tif (vendingMachine is NPCVendingMachine)\n\t{\n\t\treturn true;\n\t}\n\tif (!vendingMachine.IsBroadcasting())\n\t{\n\t\treturn false;\n\t}\n\tif (!config.IsVendingMachineAccessible(vendingMachine, offset, out var _))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "MarketTerminal marketTerminal, VendingMachine vendingMachine",
      "TargetName": "MarketTerminal",
      "MethodName": "<GetDeliveryEligibleVendingMachines>g__IsEligible|43_0",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1029092944,
      "Name": "OnVendingShopOpen",
      "FullName": "OnVendingShopOpen [NPCTalking]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "InvisibleVendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vending shop is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnConversationAction(BasePlayer player, string action)\n{\n\tif (action == \"openvending\")\n\t{\n\t\tInvisibleVendingMachine vendingMachine = GetVendingMachine();\n\t\tif (vendingMachine != null && UnityEngine.Vector3.Distance(player.transform.position, base.transform.position) < 5f)\n\t\t{\n\t\t\tForceEndConversation(player);\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnVendingShopOpen\", vendingMachine, player) == null)\n\t\t\t{\n\t\t\t\tvendingMachine.PlayerOpenLoot(player, \"vendingmachine.customer\", doPositionChecks: false);\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnVendingShopOpened\", vendingMachine, player);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(\"scrap\");\n\tNPCTalking.NPCConversationResultAction[] array = conversationResultActions;\n\tforeach (NPCTalking.NPCConversationResultAction nPCConversationResultAction in array)\n\t{\n\t\tif (!(nPCConversationResultAction.action == action))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tCleanupConversingPlayers();\n\t\tforeach (BasePlayer conversingPlayer in conversingPlayers)\n\t\t{\n\t\t\tif (conversingPlayer == player || conversingPlayer == null)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint speechNodeIndex = -1;\n\t\t\tConversationData conversationFor = GetConversationFor(player);\n\t\t\tConversationData.AbstractConversationNodeData[] controlNodes = conversationFor.controlNodes;\n\t\t\tfor (int j = 0; j < controlNodes.Length; j++)\n\t\t\t{\n\t\t\t\tif (controlNodes[j] is ConversationData.ActionEventOtherPlayerInvokedData actionEventOtherPlayerInvokedData)\n\t\t\t\t{\n\t\t\t\t\tspeechNodeIndex = conversationFor.GetSpeechNodeIndex(actionEventOtherPlayerInvokedData.resultingNode);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tForceSpeechNode(conversingPlayer, conversationFor, speechNodeIndex);\n\t\t}\n\t\tint num = nPCConversationResultAction.scrapCost;\n\t\tusing PooledList<Item> pooledList = Facepunch.Pool.Get<PooledList<Item>>();\n\t\tplayer.inventory.FindItemsByItemID(pooledList, itemDefinition.itemid);\n\t\tforeach (Item item in pooledList)\n\t\t{\n\t\t\tnum -= item.amount;\n\t\t}\n\t\tif (num > 0)\n\t\t{\n\t\t\tint speechNodeIndex2 = -1;\n\t\t\tConversationData conversationFor2 = GetConversationFor(player);\n\t\t\tConversationData.AbstractConversationNodeData[] controlNodes = conversationFor2.controlNodes;\n\t\t\tfor (int j = 0; j < controlNodes.Length; j++)\n\t\t\t{\n\t\t\t\tif (controlNodes[j] is ConversationData.ActionEventPlayerTooPoorNodeData actionEventPlayerTooPoorNodeData)\n\t\t\t\t{\n\t\t\t\t\tspeechNodeIndex2 = conversationFor2.GetSpeechNodeIndex(actionEventPlayerTooPoorNodeData.resultingNode);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tForceSpeechNode(player, conversationFor2, speechNodeIndex2);\n\t\t\tbreak;\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnNPCVendor(player, this, nPCConversationResultAction.scrapCost, nPCConversationResultAction.action);\n\t\tnum = nPCConversationResultAction.scrapCost;\n\t\tforeach (Item item2 in pooledList)\n\t\t{\n\t\t\tint num2 = UnityEngine.Mathf.Min(num, item2.amount);\n\t\t\titem2.UseItem(num2);\n\t\t\tnum -= num2;\n\t\t\tif (num <= 0)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tlastActionPlayer = player;\n\t\tBroadcastEntityMessage(nPCConversationResultAction.broadcastMessage, nPCConversationResultAction.broadcastRange);\n\t\tlastActionPlayer = null;\n\t\tbreak;\n\t}\n}\n",
      "ParametersText": "InvisibleVendingMachine local1, BasePlayer player",
      "TargetName": "NPCTalking",
      "MethodName": "OnConversationAction",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 397104876,
      "Name": "OnVendingShopOpened",
      "FullName": "OnVendingShopOpened [NPCTalking]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "InvisibleVendingMachine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vending shop is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnConversationAction(BasePlayer player, string action)\n{\n\tif (action == \"openvending\")\n\t{\n\t\tInvisibleVendingMachine vendingMachine = GetVendingMachine();\n\t\tif (vendingMachine != null && UnityEngine.Vector3.Distance(player.transform.position, base.transform.position) < 5f)\n\t\t{\n\t\t\tForceEndConversation(player);\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnVendingShopOpen\", vendingMachine, player) == null)\n\t\t\t{\n\t\t\t\tvendingMachine.PlayerOpenLoot(player, \"vendingmachine.customer\", doPositionChecks: false);\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnVendingShopOpened\", vendingMachine, player);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t}\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(\"scrap\");\n\tNPCTalking.NPCConversationResultAction[] array = conversationResultActions;\n\tforeach (NPCTalking.NPCConversationResultAction nPCConversationResultAction in array)\n\t{\n\t\tif (!(nPCConversationResultAction.action == action))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tCleanupConversingPlayers();\n\t\tforeach (BasePlayer conversingPlayer in conversingPlayers)\n\t\t{\n\t\t\tif (conversingPlayer == player || conversingPlayer == null)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tint speechNodeIndex = -1;\n\t\t\tConversationData conversationFor = GetConversationFor(player);\n\t\t\tConversationData.AbstractConversationNodeData[] controlNodes = conversationFor.controlNodes;\n\t\t\tfor (int j = 0; j < controlNodes.Length; j++)\n\t\t\t{\n\t\t\t\tif (controlNodes[j] is ConversationData.ActionEventOtherPlayerInvokedData actionEventOtherPlayerInvokedData)\n\t\t\t\t{\n\t\t\t\t\tspeechNodeIndex = conversationFor.GetSpeechNodeIndex(actionEventOtherPlayerInvokedData.resultingNode);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tForceSpeechNode(conversingPlayer, conversationFor, speechNodeIndex);\n\t\t}\n\t\tint num = nPCConversationResultAction.scrapCost;\n\t\tusing PooledList<Item> pooledList = Facepunch.Pool.Get<PooledList<Item>>();\n\t\tplayer.inventory.FindItemsByItemID(pooledList, itemDefinition.itemid);\n\t\tforeach (Item item in pooledList)\n\t\t{\n\t\t\tnum -= item.amount;\n\t\t}\n\t\tif (num > 0)\n\t\t{\n\t\t\tint speechNodeIndex2 = -1;\n\t\t\tConversationData conversationFor2 = GetConversationFor(player);\n\t\t\tConversationData.AbstractConversationNodeData[] controlNodes = conversationFor2.controlNodes;\n\t\t\tfor (int j = 0; j < controlNodes.Length; j++)\n\t\t\t{\n\t\t\t\tif (controlNodes[j] is ConversationData.ActionEventPlayerTooPoorNodeData actionEventPlayerTooPoorNodeData)\n\t\t\t\t{\n\t\t\t\t\tspeechNodeIndex2 = conversationFor2.GetSpeechNodeIndex(actionEventPlayerTooPoorNodeData.resultingNode);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tForceSpeechNode(player, conversationFor2, speechNodeIndex2);\n\t\t\tbreak;\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnNPCVendor(player, this, nPCConversationResultAction.scrapCost, nPCConversationResultAction.action);\n\t\tnum = nPCConversationResultAction.scrapCost;\n\t\tforeach (Item item2 in pooledList)\n\t\t{\n\t\t\tint num2 = UnityEngine.Mathf.Min(num, item2.amount);\n\t\t\titem2.UseItem(num2);\n\t\t\tnum -= num2;\n\t\t\tif (num <= 0)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tlastActionPlayer = player;\n\t\tBroadcastEntityMessage(nPCConversationResultAction.broadcastMessage, nPCConversationResultAction.broadcastRange);\n\t\tlastActionPlayer = null;\n\t\tbreak;\n\t}\n}\n",
      "ParametersText": "InvisibleVendingMachine local1, BasePlayer player",
      "TargetName": "NPCTalking",
      "MethodName": "OnConversationAction",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1029092944,
      "Name": "OnVendingShopOpen",
      "FullName": "OnVendingShopOpen [TravellingVendor]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "travellingVendor",
          "typeName": "TravellingVendor",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vending shop is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SV_OpenMenu(BaseEntity.RPCMessage msg)\n{\n\tif (vendingMachine == null)\n\t{\n\t\tvendingMachine = GetComponentInChildren<NPCVendingMachine>();\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnVendingShopOpen\", vendingMachine, msg.player) == null)\n\t{\n\t\tvendingMachine.OpenShop(msg.player);\n\t\tOxide.Core.Interface.CallHook(\"OnVendingShopOpened\", vendingMachine, msg.player);\n\t}\n}\n",
      "ParametersText": "TravellingVendor travellingVendor, BasePlayer player",
      "TargetName": "TravellingVendor",
      "MethodName": "SV_OpenMenu",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 397104876,
      "Name": "OnVendingShopOpened",
      "FullName": "OnVendingShopOpened [TravellingVendor]",
      "Category": "Vending",
      "Parameters": [
        {
          "name": "travellingVendor",
          "typeName": "TravellingVendor",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vending shop is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SV_OpenMenu(BaseEntity.RPCMessage msg)\n{\n\tif (vendingMachine == null)\n\t{\n\t\tvendingMachine = GetComponentInChildren<NPCVendingMachine>();\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnVendingShopOpen\", vendingMachine, msg.player) == null)\n\t{\n\t\tvendingMachine.OpenShop(msg.player);\n\t\tOxide.Core.Interface.CallHook(\"OnVendingShopOpened\", vendingMachine, msg.player);\n\t}\n}\n",
      "ParametersText": "TravellingVendor travellingVendor, BasePlayer player",
      "TargetName": "TravellingVendor",
      "MethodName": "SV_OpenMenu",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Animal": [
    {
      "Id": 2434657963,
      "Name": "OnHorseLead",
      "FullName": "OnHorseLead [RidableHorse]",
      "Category": "Animal",
      "Parameters": [
        {
          "name": "ridableHorse",
          "typeName": "RidableHorse",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when horse lead occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SERVER_Lead(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = msg.read.Bool();\n\tif (flag)\n\t{\n\t\tif (!CanLead(player))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\telse if (!CanStopLead(player))\n\t{\n\t\treturn;\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnHorseLead\", this, player) == null)\n\t{\n\t\tSetLeading(flag ? player : null);\n\t}\n}\n",
      "ParametersText": "RidableHorse ridableHorse, BasePlayer local0",
      "TargetName": "RidableHorse",
      "MethodName": "SERVER_Lead",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2611596445,
      "Name": "OnRidableAnimalClaim",
      "FullName": "OnRidableAnimalClaim [RidableHorse]",
      "Category": "Animal",
      "Parameters": [
        {
          "name": "ridableHorse",
          "typeName": "RidableHorse",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a ridable animal is claimed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SERVER_Claim(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && IsForSale)\n\t{\n\t\tint tokenItemID = msg.read.Int32();\n\t\tItem purchaseToken = GetPurchaseToken(player, tokenItemID);\n\t\tif (purchaseToken != null && Oxide.Core.Interface.CallHook(\"OnRidableAnimalClaim\", this, player, purchaseToken) == null && ItemIsSaddle(purchaseToken))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved2, b: false);\n\t\t\tOnClaimedWithToken(purchaseToken);\n\t\t\tpurchaseToken.UseItem();\n\t\t\tFacepunch.Rust.Analytics.Azure.OnVehiclePurchased(msg.player, this);\n\t\t\tAttemptMount(player, doMountChecks: false);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRidableAnimalClaimed\", this, player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RidableHorse ridableHorse, BasePlayer local0, Item local2",
      "TargetName": "RidableHorse",
      "MethodName": "SERVER_Claim",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 617527508,
      "Name": "OnRidableAnimalClaimed",
      "FullName": "OnRidableAnimalClaimed [RidableHorse]",
      "Category": "Animal",
      "Parameters": [
        {
          "name": "ridableHorse",
          "typeName": "RidableHorse",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a ridable animal is claimed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SERVER_Claim(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && IsForSale)\n\t{\n\t\tint tokenItemID = msg.read.Int32();\n\t\tItem purchaseToken = GetPurchaseToken(player, tokenItemID);\n\t\tif (purchaseToken != null && Oxide.Core.Interface.CallHook(\"OnRidableAnimalClaim\", this, player, purchaseToken) == null && ItemIsSaddle(purchaseToken))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved2, b: false);\n\t\t\tOnClaimedWithToken(purchaseToken);\n\t\t\tpurchaseToken.UseItem();\n\t\t\tFacepunch.Rust.Analytics.Azure.OnVehiclePurchased(msg.player, this);\n\t\t\tAttemptMount(player, doMountChecks: false);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRidableAnimalClaimed\", this, player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RidableHorse ridableHorse, BasePlayer local0",
      "TargetName": "RidableHorse",
      "MethodName": "SERVER_Claim",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 73579294,
      "Name": "OnAnimalDungProduce",
      "FullName": "OnAnimalDungProduce [RidableHorse]",
      "Category": "Animal",
      "Parameters": [
        {
          "name": "ridableHorse",
          "typeName": "RidableHorse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when animal dung produce occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void DoDung()\n{\n\tdungProduction -= 1f;\n\tif (Oxide.Core.Interface.CallHook(\"OnAnimalDungProduce\", this) == null)\n\t{\n\t\tUnityEngine.Quaternion rotation = UnityEngine.Quaternion.Euler(UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f));\n\t\tUnityEngine.Vector3 vVelocity = new UnityEngine.Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-1f, -3f), UnityEngine.Random.Range(-0.5f, 0.5f));\n\t\tItem item = ItemManager.Create(dungItem, 1, 0uL);\n\t\titem.SetItemOwnership(currentBreed.breedName.english, ItemOwnershipPhrases.Pooped);\n\t\titem.Drop(dungSpawnPoint.position + UnityEngine.Random.insideUnitSphere * 0.1f, vVelocity, rotation);\n\t\tOxide.Core.Interface.CallHook(\"OnAnimalDungProduced\", this, item);\n\t}\n}\n",
      "ParametersText": "RidableHorse ridableHorse",
      "TargetName": "RidableHorse",
      "MethodName": "DoDung",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 878484420,
      "Name": "OnAnimalDungProduced",
      "FullName": "OnAnimalDungProduced [RidableHorse]",
      "Category": "Animal",
      "Parameters": [
        {
          "name": "ridableHorse",
          "typeName": "RidableHorse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an animal dung is produced."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void DoDung()\n{\n\tdungProduction -= 1f;\n\tif (Oxide.Core.Interface.CallHook(\"OnAnimalDungProduce\", this) == null)\n\t{\n\t\tUnityEngine.Quaternion rotation = UnityEngine.Quaternion.Euler(UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f));\n\t\tUnityEngine.Vector3 vVelocity = new UnityEngine.Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-1f, -3f), UnityEngine.Random.Range(-0.5f, 0.5f));\n\t\tItem item = ItemManager.Create(dungItem, 1, 0uL);\n\t\titem.SetItemOwnership(currentBreed.breedName.english, ItemOwnershipPhrases.Pooped);\n\t\titem.Drop(dungSpawnPoint.position + UnityEngine.Random.insideUnitSphere * 0.1f, vVelocity, rotation);\n\t\tOxide.Core.Interface.CallHook(\"OnAnimalDungProduced\", this, item);\n\t}\n}\n",
      "ParametersText": "RidableHorse ridableHorse",
      "TargetName": "RidableHorse",
      "MethodName": "DoDung",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 878484420,
      "Name": "OnAnimalDungProduced",
      "FullName": "OnAnimalDungProduced [RidableHorse] [Variable]",
      "Category": "Animal",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an animal dung is produced."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void DoDung()\n{\n\tdungProduction -= 1f;\n\tif (Oxide.Core.Interface.CallHook(\"OnAnimalDungProduce\", this) == null)\n\t{\n\t\tUnityEngine.Quaternion rotation = UnityEngine.Quaternion.Euler(UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f), UnityEngine.Random.Range(-180f, 180f));\n\t\tUnityEngine.Vector3 vVelocity = new UnityEngine.Vector3(UnityEngine.Random.Range(-0.5f, 0.5f), UnityEngine.Random.Range(-1f, -3f), UnityEngine.Random.Range(-0.5f, 0.5f));\n\t\tItem item = ItemManager.Create(dungItem, 1, 0uL);\n\t\titem.SetItemOwnership(currentBreed.breedName.english, ItemOwnershipPhrases.Pooped);\n\t\titem.Drop(dungSpawnPoint.position + UnityEngine.Random.insideUnitSphere * 0.1f, vVelocity, rotation);\n\t\tOxide.Core.Interface.CallHook(\"OnAnimalDungProduced\", this, item);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "RidableHorse",
      "MethodName": "DoDung",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3062212715,
      "Name": "OnHorseHitch",
      "FullName": "OnHorseHitch",
      "Category": "Animal",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when horse hitch occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool AttemptToHitch(HitchTrough.IHitchable hitchable, HitchTrough.HitchSpot spot = null)\n{\n\tif (hitchable == null)\n\t{\n\t\treturn false;\n\t}\n\tif (spot == null)\n\t{\n\t\tBaseEntity baseEntity = hitchable as BaseEntity;\n\t\tif (baseEntity != null)\n\t\t{\n\t\t\tspot = GetClosestSpot(baseEntity.transform.position);\n\t\t}\n\t}\n\tif (spot != null)\n\t{\n\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnHorseHitch\", hitchable, spot);\n\t\tif (obj is bool)\n\t\t{\n\t\t\treturn (bool)obj;\n\t\t}\n\t\tspot.SetOccupiedBy(hitchable);\n\t\thitchable.SetHitch(this, spot);\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "HitchTrough",
      "MethodName": "AttemptToHitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1764412199,
      "Name": "OnHorseUnhitch",
      "FullName": "OnHorseUnhitch",
      "Category": "Animal",
      "Parameters": [
        {
          "name": "hitchable",
          "typeName": "HitchTrough+IHitchable",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "HitchTrough+HitchSpot",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when horse unhitch occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UnHitch(HitchTrough.IHitchable hitchable)\n{\n\tHitchTrough.HitchSpot[] array = hitchSpots;\n\tforeach (HitchTrough.HitchSpot hitchSpot in array)\n\t{\n\t\tif (hitchSpot.GetHitchable(base.isServer) == hitchable)\n\t\t{\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnHorseUnhitch\", hitchable, hitchSpot) != null)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\thitchSpot.SetOccupiedBy(null);\n\t\t\thitchable.SetHitch(null, null);\n\t\t}\n\t}\n}\n",
      "ParametersText": "HitchTrough.IHitchable hitchable, HitchTrough.HitchSpot local2",
      "TargetName": "HitchTrough",
      "MethodName": "UnHitch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Bookmark": [
    {
      "Id": 2564888972,
      "Name": "OnBookmarkControl",
      "FullName": "OnBookmarkControl",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "IRemoteControllable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bookmark control occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void BeginControllingBookmark(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!IsPlayerAtStation(player))\n\t{\n\t\treturn;\n\t}\n\tstring text = msg.read.String();\n\tif (!IsValidIdentifier(text) || !controlBookmarks.Contains(text))\n\t{\n\t\treturn;\n\t}\n\tIRemoteControllable remoteControllable = RemoteControlEntity.FindByID(text);\n\tif (remoteControllable == null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity ent = remoteControllable.GetEnt();\n\tif (ent == null)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"RC identifier \" + text + \" was found but has a null or destroyed entity, this should never happen\");\n\t}\n\telse if (remoteControllable.CanControl(player.userID) && !(UnityEngine.Vector3.Distance(base.transform.position, ent.transform.position) >= remoteControllable.MaxRange) && Oxide.Core.Interface.CallHook(\"OnBookmarkControl\", this, player, text, remoteControllable) == null)\n\t{\n\t\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tIRemoteControllable component = baseEntity.GetComponent<IRemoteControllable>();\n\t\t\tcomponent?.StopControl(new CameraViewerId(currentPlayerID, 0L));\n\t\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlEnded\", this, player, component);\n\t\t}\n\t\tplayer.net.SwitchSecondaryGroup(ent.net.group);\n\t\tplayer.SetRcEntityPosition(ent.transform.position);\n\t\tcurrentlyControllingEnt.uid = ent.net.ID;\n\t\tcurrentPlayerID = player.userID;\n\t\tbool b = remoteControllable.InitializeControl(new CameraViewerId(currentPlayerID, 0L));\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b, recursive: false, networkupdate: false);\n\t\tSendNetworkUpdateImmediate();\n\t\tSendControlBookmarks(player);\n\t\tif (Rust.GameInfo.HasAchievements && remoteControllable.GetEnt() is CCTV_RC)\n\t\t{\n\t\t\tInvokeRepeating(CheckCCTVAchievement, 1f, 3f);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlStarted\", this, player, text, remoteControllable);\n\t\tInvokeRepeating(ControlCheck, 0f, 0f);\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer local0, string local1, IRemoteControllable local2",
      "TargetName": "ComputerStation",
      "MethodName": "BeginControllingBookmark",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1206891691,
      "Name": "OnBookmarkAdd",
      "FullName": "OnBookmarkAdd",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bookmark is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void AddBookmark(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!IsPlayerAtStation(player) || isStatic)\n\t{\n\t\treturn;\n\t}\n\tif (UnityEngine.Time.realtimeSinceStartup < nextAddTime)\n\t{\n\t\tplayer.ChatMessage(\"Slow down...\");\n\t\treturn;\n\t}\n\tif (controlBookmarks.Count >= 128)\n\t{\n\t\tplayer.ChatMessage(\"Too many bookmarks, delete some\");\n\t\treturn;\n\t}\n\tnextAddTime = UnityEngine.Time.realtimeSinceStartup + 1f;\n\tstring text = msg.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"OnBookmarkAdd\", this, player, text) == null)\n\t{\n\t\tForceAddBookmark(text);\n\t\tSendControlBookmarks(player);\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer local0, string local1",
      "TargetName": "ComputerStation",
      "MethodName": "AddBookmark",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2021417980,
      "Name": "OnBookmarksSendControl",
      "FullName": "OnBookmarksSendControl",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bookmarks send control occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendControlBookmarks(BasePlayer player)\n{\n\tif (!(player == null))\n\t{\n\t\tstring text = GenerateControlBookmarkString();\n\t\tif (Oxide.Core.Interface.CallHook(\"OnBookmarksSendControl\", this, player, text) == null)\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"ReceiveBookmarks\", player), text);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer player, string local0",
      "TargetName": "ComputerStation",
      "MethodName": "SendControlBookmarks",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3610365652,
      "Name": "OnBookmarkControlEnd",
      "FullName": "OnBookmarkControlEnd",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "ply",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bookmark control ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StopControl(BasePlayer ply)\n{\n\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\tif ((bool)baseEntity)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnBookmarkControlEnd\", this, ply, baseEntity) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbaseEntity.GetComponent<IRemoteControllable>().StopControl(new CameraViewerId(currentPlayerID, 0L));\n\t}\n\tif ((bool)ply)\n\t{\n\t\tply.net.SwitchSecondaryGroup(null);\n\t\tply.SetRcEntityPosition(null);\n\t}\n\tcurrentlyControllingEnt.uid = default(NetworkableId);\n\tcurrentPlayerID = 0uL;\n\tSetFlag(BaseEntity.Flags.Reserved2, b: false, recursive: false, networkupdate: false);\n\tSendNetworkUpdate();\n\tSendControlBookmarks(ply);\n\tCancelInvoke(ControlCheck);\n\tOxide.Core.Interface.CallHook(\"OnBookmarkControlEnded\", this, ply, baseEntity);\n\tCancelInvoke(CheckCCTVAchievement);\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer ply, BaseEntity local0",
      "TargetName": "ComputerStation",
      "MethodName": "StopControl",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3231378518,
      "Name": "OnBookmarkInput",
      "FullName": "OnBookmarkInput",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "inputState",
          "typeName": "InputState",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bookmark input occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void PlayerServerInput(InputState inputState, BasePlayer player)\n{\n\tbase.PlayerServerInput(inputState, player);\n\tif (spawnedIo.IsValid(base.isServer))\n\t{\n\t\tIOEntity iOEntity = spawnedIo.Get(base.isServer);\n\t\tif ((iOEntity != null) & !iOEntity.IsPowered())\n\t\t{\n\t\t\tDismountAllPlayers();\n\t\t}\n\t}\n\tif (HasFlag(BaseEntity.Flags.Reserved2) && currentlyControllingEnt.IsValid(serverside: true) && Oxide.Core.Interface.CallHook(\"OnBookmarkInput\", this, player, inputState) == null)\n\t{\n\t\tcurrentlyControllingEnt.Get(serverside: true).GetComponent<IRemoteControllable>().UserInput(inputState, new CameraViewerId(player.userID, 0L));\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer player, InputState inputState",
      "TargetName": "ComputerStation",
      "MethodName": "PlayerServerInput",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2318406615,
      "Name": "OnBookmarkControlStarted",
      "FullName": "OnBookmarkControlStarted",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "IRemoteControllable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bookmark control starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void BeginControllingBookmark(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!IsPlayerAtStation(player))\n\t{\n\t\treturn;\n\t}\n\tstring text = msg.read.String();\n\tif (!IsValidIdentifier(text) || !controlBookmarks.Contains(text))\n\t{\n\t\treturn;\n\t}\n\tIRemoteControllable remoteControllable = RemoteControlEntity.FindByID(text);\n\tif (remoteControllable == null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity ent = remoteControllable.GetEnt();\n\tif (ent == null)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"RC identifier \" + text + \" was found but has a null or destroyed entity, this should never happen\");\n\t}\n\telse if (remoteControllable.CanControl(player.userID) && !(UnityEngine.Vector3.Distance(base.transform.position, ent.transform.position) >= remoteControllable.MaxRange) && Oxide.Core.Interface.CallHook(\"OnBookmarkControl\", this, player, text, remoteControllable) == null)\n\t{\n\t\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tIRemoteControllable component = baseEntity.GetComponent<IRemoteControllable>();\n\t\t\tcomponent?.StopControl(new CameraViewerId(currentPlayerID, 0L));\n\t\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlEnded\", this, player, component);\n\t\t}\n\t\tplayer.net.SwitchSecondaryGroup(ent.net.group);\n\t\tplayer.SetRcEntityPosition(ent.transform.position);\n\t\tcurrentlyControllingEnt.uid = ent.net.ID;\n\t\tcurrentPlayerID = player.userID;\n\t\tbool b = remoteControllable.InitializeControl(new CameraViewerId(currentPlayerID, 0L));\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b, recursive: false, networkupdate: false);\n\t\tSendNetworkUpdateImmediate();\n\t\tSendControlBookmarks(player);\n\t\tif (Rust.GameInfo.HasAchievements && remoteControllable.GetEnt() is CCTV_RC)\n\t\t{\n\t\t\tInvokeRepeating(CheckCCTVAchievement, 1f, 3f);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlStarted\", this, player, text, remoteControllable);\n\t\tInvokeRepeating(ControlCheck, 0f, 0f);\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer local0, string local1, IRemoteControllable local2",
      "TargetName": "ComputerStation",
      "MethodName": "BeginControllingBookmark",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 764919103,
      "Name": "OnBookmarkControlEnded",
      "FullName": "OnBookmarkControlEnded",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "ply",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bookmark control ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StopControl(BasePlayer ply)\n{\n\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\tif ((bool)baseEntity)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnBookmarkControlEnd\", this, ply, baseEntity) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbaseEntity.GetComponent<IRemoteControllable>().StopControl(new CameraViewerId(currentPlayerID, 0L));\n\t}\n\tif ((bool)ply)\n\t{\n\t\tply.net.SwitchSecondaryGroup(null);\n\t\tply.SetRcEntityPosition(null);\n\t}\n\tcurrentlyControllingEnt.uid = default(NetworkableId);\n\tcurrentPlayerID = 0uL;\n\tSetFlag(BaseEntity.Flags.Reserved2, b: false, recursive: false, networkupdate: false);\n\tSendNetworkUpdate();\n\tSendControlBookmarks(ply);\n\tCancelInvoke(ControlCheck);\n\tOxide.Core.Interface.CallHook(\"OnBookmarkControlEnded\", this, ply, baseEntity);\n\tCancelInvoke(CheckCCTVAchievement);\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer ply, BaseEntity local0",
      "TargetName": "ComputerStation",
      "MethodName": "StopControl",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 764919103,
      "Name": "OnBookmarkControlEnded",
      "FullName": "OnBookmarkControlEnded [2]",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local6",
          "typeName": "IRemoteControllable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bookmark control ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void BeginControllingBookmark(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!IsPlayerAtStation(player))\n\t{\n\t\treturn;\n\t}\n\tstring text = msg.read.String();\n\tif (!IsValidIdentifier(text) || !controlBookmarks.Contains(text))\n\t{\n\t\treturn;\n\t}\n\tIRemoteControllable remoteControllable = RemoteControlEntity.FindByID(text);\n\tif (remoteControllable == null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity ent = remoteControllable.GetEnt();\n\tif (ent == null)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"RC identifier \" + text + \" was found but has a null or destroyed entity, this should never happen\");\n\t}\n\telse if (remoteControllable.CanControl(player.userID) && !(UnityEngine.Vector3.Distance(base.transform.position, ent.transform.position) >= remoteControllable.MaxRange) && Oxide.Core.Interface.CallHook(\"OnBookmarkControl\", this, player, text, remoteControllable) == null)\n\t{\n\t\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tIRemoteControllable component = baseEntity.GetComponent<IRemoteControllable>();\n\t\t\tcomponent?.StopControl(new CameraViewerId(currentPlayerID, 0L));\n\t\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlEnded\", this, player, component);\n\t\t}\n\t\tplayer.net.SwitchSecondaryGroup(ent.net.group);\n\t\tplayer.SetRcEntityPosition(ent.transform.position);\n\t\tcurrentlyControllingEnt.uid = ent.net.ID;\n\t\tcurrentPlayerID = player.userID;\n\t\tbool b = remoteControllable.InitializeControl(new CameraViewerId(currentPlayerID, 0L));\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b, recursive: false, networkupdate: false);\n\t\tSendNetworkUpdateImmediate();\n\t\tSendControlBookmarks(player);\n\t\tif (Rust.GameInfo.HasAchievements && remoteControllable.GetEnt() is CCTV_RC)\n\t\t{\n\t\t\tInvokeRepeating(CheckCCTVAchievement, 1f, 3f);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlStarted\", this, player, text, remoteControllable);\n\t\tInvokeRepeating(ControlCheck, 0f, 0f);\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer local0, IRemoteControllable local6",
      "TargetName": "ComputerStation",
      "MethodName": "BeginControllingBookmark",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 373279383,
      "Name": "OnBookmarkDelete",
      "FullName": "OnBookmarkDelete",
      "Category": "Bookmark",
      "Parameters": [
        {
          "name": "computerStation",
          "typeName": "ComputerStation",
          "optional": false
        },
        {
          "name": "mountedPlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "identifier",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bookmark is deleted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void RemoveBookmark(string identifier, BasePlayer mountedPlayer = null)\n{\n\tif (!IsValidIdentifier(identifier) || !controlBookmarks.Contains(identifier) || Oxide.Core.Interface.CallHook(\"OnBookmarkDelete\", this, mountedPlayer, identifier) != null)\n\t{\n\t\treturn;\n\t}\n\tcontrolBookmarks.Remove(identifier);\n\tif (mountedPlayer != null)\n\t{\n\t\tSendControlBookmarks(mountedPlayer);\n\t\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\t\tif (baseEntity != null && baseEntity.TryGetComponent<IRemoteControllable>(out var component) && component.GetIdentifier() == identifier)\n\t\t{\n\t\t\tStopControl(mountedPlayer);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ComputerStation computerStation, BasePlayer mountedPlayer, string identifier",
      "TargetName": "ComputerStation",
      "MethodName": "RemoveBookmark",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 527342893,
      "Name": "OnBookmarkControlEnded [2] [patch]",
      "FullName": "OnBookmarkControlEnded [2] [patch]",
      "Category": "Bookmark",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void BeginControllingBookmark(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!IsPlayerAtStation(player))\n\t{\n\t\treturn;\n\t}\n\tstring text = msg.read.String();\n\tif (!IsValidIdentifier(text) || !controlBookmarks.Contains(text))\n\t{\n\t\treturn;\n\t}\n\tIRemoteControllable remoteControllable = RemoteControlEntity.FindByID(text);\n\tif (remoteControllable == null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity ent = remoteControllable.GetEnt();\n\tif (ent == null)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"RC identifier \" + text + \" was found but has a null or destroyed entity, this should never happen\");\n\t}\n\telse if (remoteControllable.CanControl(player.userID) && !(UnityEngine.Vector3.Distance(base.transform.position, ent.transform.position) >= remoteControllable.MaxRange) && Oxide.Core.Interface.CallHook(\"OnBookmarkControl\", this, player, text, remoteControllable) == null)\n\t{\n\t\tBaseEntity baseEntity = currentlyControllingEnt.Get(serverside: true);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tIRemoteControllable component = baseEntity.GetComponent<IRemoteControllable>();\n\t\t\tcomponent?.StopControl(new CameraViewerId(currentPlayerID, 0L));\n\t\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlEnded\", this, player, component);\n\t\t}\n\t\tplayer.net.SwitchSecondaryGroup(ent.net.group);\n\t\tplayer.SetRcEntityPosition(ent.transform.position);\n\t\tcurrentlyControllingEnt.uid = ent.net.ID;\n\t\tcurrentPlayerID = player.userID;\n\t\tbool b = remoteControllable.InitializeControl(new CameraViewerId(currentPlayerID, 0L));\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b, recursive: false, networkupdate: false);\n\t\tSendNetworkUpdateImmediate();\n\t\tSendControlBookmarks(player);\n\t\tif (Rust.GameInfo.HasAchievements && remoteControllable.GetEnt() is CCTV_RC)\n\t\t{\n\t\t\tInvokeRepeating(CheckCCTVAchievement, 1f, 3f);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnBookmarkControlStarted\", this, player, text, remoteControllable);\n\t\tInvokeRepeating(ControlCheck, 0f, 0f);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ComputerStation",
      "MethodName": "BeginControllingBookmark",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Clan": [
    {
      "Id": 3208843923,
      "Name": "OnClanDisbanded",
      "FullName": "OnClanDisbanded",
      "Category": "Clan",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "LocalClan",
          "optional": false
        },
        {
          "name": "localClan+<Disband>d__72",
          "typeName": "LocalClan+<Disband>d__72",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a clan is disbanded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "LocalClan local1, LocalClan.<Disband>d__72 localClan+<Disband>d__72",
      "TargetName": "LocalClan/<Disband>d__72",
      "MethodName": "MoveNext",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3053309100,
      "Name": "OnClanCreated",
      "FullName": "OnClanCreated",
      "Category": "Clan",
      "Parameters": [
        {
          "name": "leaderSteamId",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a clan is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public async System.Threading.Tasks.ValueTask<ClanValueResult<IClan>> Create(ulong leaderSteamId, string name)\n{\n\tDatabase.BeginTransaction();\n\tlong clanId;\n\ttry\n\t{\n\t\ttry\n\t\t{\n\t\t\tclanId = Database.CreateClan(name, leaderSteamId) ?? throw new System.Exception(\"Failed to create clan\");\n\t\t}\n\t\tcatch (Facepunch.Sqlite.SqliteException ex) when (ex.Result == 2067)\n\t\t{\n\t\t\tDatabase.Rollback();\n\t\t\treturn ClanResult.DuplicateName;\n\t\t}\n\t\tint num = Database.CreateRole(clanId, new ClanRole\n\t\t{\n\t\t\tName = \"Leader\",\n\t\t\tCanSetMotd = true,\n\t\t\tCanSetLogo = true,\n\t\t\tCanInvite = true,\n\t\t\tCanKick = true,\n\t\t\tCanPromote = true,\n\t\t\tCanDemote = true,\n\t\t\tCanSetPlayerNotes = true\n\t\t}) ?? throw new System.Exception(\"Failed to create leader role\");\n\t\tif (num != 1)\n\t\t{\n\t\t\tthrow new System.Exception(\"Owner role does not have rank 1!\");\n\t\t}\n\t\t_ = Database.CreateRole(clanId, new ClanRole\n\t\t{\n\t\t\tName = \"Member\",\n\t\t\tCanSetMotd = false,\n\t\t\tCanSetLogo = false,\n\t\t\tCanInvite = false,\n\t\t\tCanKick = false,\n\t\t\tCanPromote = false,\n\t\t\tCanDemote = false,\n\t\t\tCanSetPlayerNotes = false\n\t\t}) ?? throw new System.Exception(\"Failed to create member role\");\n\t\ttry\n\t\t{\n\t\t\tif (!Database.CreateMember(clanId, leaderSteamId, num))\n\t\t\t{\n\t\t\t\tthrow new System.Exception(\"Failed to add leader to new clan\");\n\t\t\t}\n\t\t}\n\t\tcatch (Facepunch.Sqlite.SqliteException ex2) when (ex2.Result == 2067)\n\t\t{\n\t\t\tDatabase.Rollback();\n\t\t\treturn ClanResult.AlreadyInAClan;\n\t\t}\n\t\tDatabase.AppendLog(clanId, \"founded\", leaderSteamId);\n\t\tDatabase.Commit();\n\t}\n\tcatch\n\t{\n\t\tDatabase.Rollback();\n\t\tthrow;\n\t}\n\tif (!TryGetClan(clanId, out var clan))\n\t{\n\t\tthrow new System.Exception(\"Couldn't find the clan we just created?\");\n\t}\n\tMembershipChanged(leaderSteamId, clan.ClanId);\n\tClanValueResult<IClan> result = (ClanValueResult<IClan>)(IClan)clan;\n\tOxide.Core.Interface.CallHook(\"OnClanCreated\", clan, leaderSteamId);\n\treturn result;\n}\n",
      "ParametersText": "ulong leaderSteamId",
      "TargetName": "LocalClanBackend",
      "MethodName": "Create",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 895202397,
      "Name": "OnClanMemberAdded",
      "FullName": "OnClanMemberAdded",
      "Category": "Clan",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a clan member is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool AcceptInvite(long clanId, ulong steamId)\n{\n\tBeginTransaction();\n\ttry\n\t{\n\t\tif (DeleteInvite(clanId, steamId) && CreateMember(clanId, steamId))\n\t\t{\n\t\t\tCommit();\n\t\t\tOxide.Core.Interface.CallHook(\"OnClanMemberAdded\", clanId, steamId);\n\t\t\treturn true;\n\t\t}\n\t\tRollback();\n\t\treturn false;\n\t}\n\tcatch\n\t{\n\t\tRollback();\n\t\tthrow;\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "LocalClanDatabase",
      "MethodName": "AcceptInvite",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1270737373,
      "Name": "OnClanMemberLeft",
      "FullName": "OnClanMemberLeft",
      "Category": "Clan",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "LocalClan",
          "optional": false
        },
        {
          "name": "localClan+<Kick>d__65",
          "typeName": "LocalClan+<Kick>d__65",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when clan member left occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "LocalClan local1, LocalClan.<Kick>d__65 localClan+<Kick>d__65",
      "TargetName": "LocalClan/<Kick>d__65",
      "MethodName": "MoveNext",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 151056655,
      "Name": "OnClanMemberKicked",
      "FullName": "OnClanMemberKicked",
      "Category": "Clan",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "LocalClan",
          "optional": false
        },
        {
          "name": "localClan+<Kick>d__65",
          "typeName": "LocalClan+<Kick>d__65",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "LocalClan+<Kick>d__65",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a clan member is kicked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "LocalClan local1, LocalClan.<Kick>d__65 localClan+<Kick>d__65, LocalClan.<Kick>d__65 self1",
      "TargetName": "LocalClan/<Kick>d__65",
      "MethodName": "MoveNext",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1049643152,
      "Name": "OnClanColorChanged",
      "FullName": "OnClanColorChanged",
      "Category": "Clan",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "LocalClan",
          "optional": false
        },
        {
          "name": "localClan+<SetColor>d__61",
          "typeName": "LocalClan+<SetColor>d__61",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "LocalClan+<SetColor>d__61",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a clan color is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "LocalClan local0, LocalClan.<SetColor>d__61 localClan+<SetColor>d__61, LocalClan.<SetColor>d__61 self1",
      "TargetName": "LocalClan/<SetColor>d__61",
      "MethodName": "MoveNext",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3755965056,
      "Name": "OnClanLogoChanged",
      "FullName": "OnClanLogoChanged",
      "Category": "Clan",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "LocalClan",
          "optional": false
        },
        {
          "name": "localClan+<SetLogo>d__60",
          "typeName": "LocalClan+<SetLogo>d__60",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "LocalClan+<SetLogo>d__60",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a clan logo is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "LocalClan local0, LocalClan.<SetLogo>d__60 localClan+<SetLogo>d__60, LocalClan.<SetLogo>d__60 self1",
      "TargetName": "LocalClan/<SetLogo>d__60",
      "MethodName": "MoveNext",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3456927188,
      "Name": "OnClanLogoChanged [patch]",
      "FullName": "OnClanLogoChanged [patch]",
      "Category": "Clan",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "LocalClan/<SetLogo>d__60",
      "MethodName": "MoveNext",
      "AssemblyName": "Rust.Clans.Local",
      "ReturnTypeName": "void"
    }
  ],
  "CommunityUI": [
    {
      "Id": 1614693435,
      "Name": "OnCuiDraggableDrag",
      "FullName": "OnCuiDraggableDrag",
      "Category": "CommunityUI",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when cui draggable drag occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Hook_DragRPC(BasePlayer player, string name, UnityEngine.Vector3 position, CommunityEntity.DraggablePositionSendType type)\n{\n\tOxide.Core.Interface.CallHook(\"OnCuiDraggableDrag\", player, name, position, type);\n}\n",
      "ParametersText": "",
      "TargetName": "CommunityEntity",
      "MethodName": "Hook_DragRPC",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2642769942,
      "Name": "OnCuiDraggableDrop",
      "FullName": "OnCuiDraggableDrop",
      "Category": "CommunityUI",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a cui draggable is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Hook_DropRPC(BasePlayer player, string draggedName, string draggedSlot, string swappedName, string swappedSlot)\n{\n\tOxide.Core.Interface.CallHook(\"OnCuiDraggableDrop\", player, draggedName, draggedSlot, swappedName, swappedSlot);\n}\n",
      "ParametersText": "",
      "TargetName": "CommunityEntity",
      "MethodName": "Hook_DropRPC",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Crafting": [
    {
      "Id": 2338075138,
      "Name": "CanRecycle",
      "FullName": "CanRecycle",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "recycler",
          "typeName": "Recycler",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to recycle.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool HasRecyclable()\n{\n\tfor (int i = 0; i < 6; i++)\n\t{\n\t\tItem slot = base.inventory.GetSlot(i);\n\t\tif (slot != null)\n\t\t{\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"CanRecycle\", this, slot);\n\t\t\tif (obj is bool)\n\t\t\t{\n\t\t\t\treturn (bool)obj;\n\t\t\t}\n\t\t\tif (slot.info.Blueprint != null)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n}\n",
      "ParametersText": "Recycler recycler, Item local1",
      "TargetName": "Recycler",
      "MethodName": "HasRecyclable",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2745299625,
      "Name": "CanBeRecycled",
      "FullName": "CanBeRecycled",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "recycler",
          "typeName": "Recycler",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be is recycled.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool CanBeRecycled(Item item)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeRecycled\", item, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (item != null)\n\t{\n\t\treturn item.info.Blueprint != null;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "Item item, Recycler recycler",
      "TargetName": "Recycler",
      "MethodName": "CanBeRecycled",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2427842956,
      "Name": "CanCraft",
      "FullName": "CanCraft [ItemCrafter]",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "itemCrafter",
          "typeName": "ItemCrafter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to craft.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanCraft(ItemBlueprint bp, int amount = 1, bool free = false)\n{\n\tif (!bp.targetItem.IsAllowed(Rust.EraRestriction.Craft))\n\t{\n\t\treturn false;\n\t}\n\tif (base.baseEntity != null && base.baseEntity.IsRestrained)\n\t{\n\t\tHandcuffs restraintItem = base.baseEntity.Belt.GetRestraintItem();\n\t\tif (restraintItem != null && restraintItem.BlockCrafting)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tfloat num = (float)amount / (float)bp.targetItem.craftingStackable;\n\tforeach (ItemCraftTask item in queue)\n\t{\n\t\tif (!item.cancelled)\n\t\t{\n\t\t\tnum += (float)item.amount / (float)item.blueprint.targetItem.craftingStackable;\n\t\t}\n\t}\n\tif (num > 8f)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanCraft\", this, bp, amount, free);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (amount < 1 || amount > bp.targetItem.craftingStackable)\n\t{\n\t\treturn false;\n\t}\n\tforeach (ItemAmount ingredient in bp.GetIngredients())\n\t{\n\t\tif (!DoesHaveUsableItem(ingredient.itemid, (int)ingredient.amount * amount))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (ingredient.itemDef.condition.enabled && !DoesHaveOKConditionItem(ingredient.itemid, (int)ingredient.amount * amount))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\treturn true;\n}\n",
      "ParametersText": "ItemCrafter itemCrafter",
      "TargetName": "ItemCrafter",
      "MethodName": "CanCraft",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 696922433,
      "Name": "OnIngredientsCollect",
      "FullName": "OnIngredientsCollect",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "itemCrafter",
          "typeName": "ItemCrafter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when ingredients collect occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void CollectIngredients(ItemBlueprint bp, ItemCraftTask task, int amount = 1, BasePlayer player = null, bool takeBroken = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnIngredientsCollect\", this, bp, task, amount, player, takeBroken) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.List<Item> list = new System.Collections.Generic.List<Item>();\n\tforeach (ItemAmount ingredient in bp.GetIngredients())\n\t{\n\t\tCollectIngredient(ingredient.itemid, (int)ingredient.amount * amount, list, takeBroken);\n\t}\n\tforeach (Item item in list)\n\t{\n\t\titem.CollectedForCrafting(player);\n\t}\n\ttask.takenItems = list;\n}\n",
      "ParametersText": "ItemCrafter itemCrafter",
      "TargetName": "ItemCrafter",
      "MethodName": "CollectIngredients",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2427842956,
      "Name": "CanCraft",
      "FullName": "CanCraft [PlayerBlueprints]",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "playerBlueprints",
          "typeName": "PlayerBlueprints",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ItemDefinition",
          "optional": false
        },
        {
          "name": "skinItemId",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to craft.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanCraft(int itemid, int skinItemId, BasePlayer player)\n{\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(itemid);\n\tif (itemDefinition == null)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanCraft\", this, itemDefinition, skinItemId);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (skinItemId != 0 && !CheckSkinOwnership(skinItemId, player))\n\t{\n\t\treturn false;\n\t}\n\tif (base.baseEntity.currentCraftLevel < (float)itemDefinition.Blueprint.GetWorkbenchLevel())\n\t{\n\t\treturn false;\n\t}\n\tif (HasUnlocked(itemDefinition))\n\t{\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "PlayerBlueprints playerBlueprints, ItemDefinition local0, int skinItemId",
      "TargetName": "PlayerBlueprints",
      "MethodName": "CanCraft",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 990784691,
      "Name": "OnEntityReskin",
      "FullName": "OnEntityReskin",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "local3",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "ItemSkinDirectory+Skin",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity reskin occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\nprivate void ChangeItemSkin(BaseEntity.RPCMessage msg)\n{\n\tNetworkableId uid = msg.read.EntityID();\n\tint targetSkin = msg.read.Int32();\n\tBaseNetworkable baseNetworkable = BaseNetworkable.serverEntities.Find(uid);\n\tif (!ValidateEntityAndSkin(msg.player, baseNetworkable, targetSkin))\n\t{\n\t\treturn;\n\t}\n\tif (baseNetworkable != null)\n\t{\n\t\tBaseEntity baseEntity2 = baseNetworkable as BaseEntity;\n\t\tif ((object)baseEntity2 != null)\n\t\t{\n\t\t\tif (!GetItemDefinitionForEntity(baseEntity2, out var def, useRedirect: false))\n\t\t\t{\n\t\t\t\tFailResponse(SprayCan.SprayFailReason.InvalidItem);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tItemDefinition itemDefinition = null;\n\t\t\tulong num = ItemDefinition.FindSkin((def.isRedirectOf != null) ? def.isRedirectOf.itemid : def.itemid, targetSkin);\n\t\t\tItemSkinDirectory.Skin skin = System.Linq.Enumerable.FirstOrDefault(((def.isRedirectOf != null) ? def.isRedirectOf : def).skins, (ItemSkinDirectory.Skin x) => x.id == targetSkin);\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnEntityReskin\", baseEntity2, skin, msg.player) != null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (skin.invItem != null && skin.invItem is ItemSkin itemSkin)\n\t\t\t{\n\t\t\t\tif (itemSkin.Redirect != null)\n\t\t\t\t{\n\t\t\t\t\titemDefinition = itemSkin.Redirect;\n\t\t\t\t}\n\t\t\t\telse if ((bool)def && def.isRedirectOf != null)\n\t\t\t\t{\n\t\t\t\t\titemDefinition = def.isRedirectOf;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (def.isRedirectOf != null || ((bool)def && def.isRedirectOf != null))\n\t\t\t{\n\t\t\t\titemDefinition = def.isRedirectOf;\n\t\t\t}\n\t\t\tif (itemDefinition == null)\n\t\t\t{\n\t\t\t\tbaseEntity2.skinID = num;\n\t\t\t\tbaseEntity2.SendNetworkUpdate();\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnEntitySkinChanged(msg.player, baseNetworkable, targetSkin);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!CanEntityBeRespawned(baseEntity2, out var reason2, out var culpritPlayer))\n\t\t\t\t{\n\t\t\t\t\tif (reason2 == SprayCan.SprayFailReason.MountedBlocked)\n\t\t\t\t\t{\n\t\t\t\t\t\tlastSprayError = string.Format(PlayerIsMounted.translated, NameHelper.GetPlayerNameStreamSafe(msg.player, culpritPlayer));\n\t\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, lastSprayError, false);\n\t\t\t\t\t}\n\t\t\t\t\tFailResponse(reason2);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!GetEntityPrefabPath(itemDefinition, out var resourcePath))\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"Cannot find resource path of redirect entity to spawn! \" + itemDefinition.gameObject.name);\n\t\t\t\t\tFailResponse(SprayCan.SprayFailReason.InvalidItem);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (global::SimpleUpgrade.IsUpgradeBlocked(baseEntity2, itemDefinition, msg.player))\n\t\t\t\t{\n\t\t\t\t\tif (DeployVolume.LastDeployHit != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tBaseEntity baseEntity3 = UnityEngine.GameObjectEx.ToBaseEntity(DeployVolume.LastDeployHit);\n\t\t\t\t\t\tif (baseEntity3 != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmsg.player.ShowBlockedByEntityToast(baseEntity3, Construction.lastPlacementError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, Construction.lastPlacementError, false);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tSprayCan.CodeLockPreserveInfo codeLockPreserveInfo = default(SprayCan.CodeLockPreserveInfo);\n\t\t\t\tif (baseEntity2 is CodeLock codeLock)\n\t\t\t\t{\n\t\t\t\t\tcodeLockPreserveInfo.code = codeLock.code;\n\t\t\t\t\tcodeLockPreserveInfo.guestCode = codeLock.guestCode;\n\t\t\t\t\tcodeLockPreserveInfo.isLocked = codeLock.IsLocked();\n\t\t\t\t\tcodeLockPreserveInfo.whitelistPlayers = Facepunch.Pool.Get<System.Collections.Generic.List<ulong>>();\n\t\t\t\t\tcodeLockPreserveInfo.guestPlayers = Facepunch.Pool.Get<System.Collections.Generic.List<ulong>>();\n\t\t\t\t\tcodeLockPreserveInfo.whitelistPlayers.AddRange(codeLock.whitelistPlayers);\n\t\t\t\t\tcodeLockPreserveInfo.guestPlayers.AddRange(codeLock.guestPlayers);\n\t\t\t\t}\n\t\t\t\tUnityEngine.Vector3 localPosition = baseEntity2.transform.localPosition;\n\t\t\t\tUnityEngine.Quaternion localRotation = baseEntity2.transform.localRotation;\n\t\t\t\tBaseEntity baseEntity4 = baseEntity2.GetParentEntity();\n\t\t\t\tfloat health = baseEntity2.Health();\n\t\t\t\tEntityRef[] slots = baseEntity2.GetSlots();\n\t\t\t\tulong ownerID = baseEntity2.OwnerID;\n\t\t\t\tfloat lastAttackedTime = ((baseEntity2 is BaseCombatEntity baseCombatEntity) ? baseCombatEntity.lastAttackedTime : 0f);\n\t\t\t\tint soilSaturation = ((baseEntity2 is PlanterBox planterBox) ? planterBox.soilSaturation : 0);\n\t\t\t\tbool flag = baseEntity2 is DecayEntity decayEntity && decayEntity.HasFlag(BaseEntity.Flags.Reserved2);\n\t\t\t\tSystem.Collections.Generic.HashSet<ulong> hashSet = null;\n\t\t\t\tif (baseEntity2 is BuildingPrivlidge buildingPrivlidge)\n\t\t\t\t{\n\t\t\t\t\thashSet = new System.Collections.Generic.HashSet<ulong>(buildingPrivlidge.authorizedPlayers);\n\t\t\t\t}\n\t\t\t\tbool flag2 = baseEntity2 is Door || baseEntity2 is BuildingPrivlidge || baseEntity2 is BoxStorage || baseEntity2 is PlanterBox;\n\t\t\t\tSystem.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> dictionary2 = new System.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>>();\n\t\t\t\tSaveEntityStorage(baseEntity2, dictionary2, 0);\n\t\t\t\tSystem.Collections.Generic.List<SprayCan.ChildPreserveInfo> obj = Facepunch.Pool.Get<System.Collections.Generic.List<SprayCan.ChildPreserveInfo>>();\n\t\t\t\tif (flag2)\n\t\t\t\t{\n\t\t\t\t\tforeach (BaseEntity child in baseEntity2.children)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj.Add(new SprayCan.ChildPreserveInfo\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTargetEntity = child,\n\t\t\t\t\t\t\tTargetBone = child.parentBone,\n\t\t\t\t\t\t\tLocalPosition = child.transform.localPosition,\n\t\t\t\t\t\t\tLocalRotation = child.transform.localRotation\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tforeach (SprayCan.ChildPreserveInfo item in obj)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.TargetEntity.SetParent(null, worldPositionStays: true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (int i = 0; i < baseEntity2.children.Count; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tSaveEntityStorage(baseEntity2.children[i], dictionary2, -1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tSprayCan.IOPreserveInfo[] array = null;\n\t\t\t\tSprayCan.IOPreserveInfo[] array2 = null;\n\t\t\t\tSystem.Collections.Generic.List<SprayCan.OtherEntityPreserveInfo> list = new System.Collections.Generic.List<SprayCan.OtherEntityPreserveInfo>();\n\t\t\t\tif (baseEntity2 is IOEntity iOEntity)\n\t\t\t\t{\n\t\t\t\t\tarray = new SprayCan.IOPreserveInfo[iOEntity.outputs.Length];\n\t\t\t\t\tfor (int j = 0; j < iOEntity.outputs.Length; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tIOEntity.IOSlot iOSlot = iOEntity.outputs[j];\n\t\t\t\t\t\tIOEntity iOEntity2 = iOSlot.connectedTo.Get();\n\t\t\t\t\t\tif (iOEntity2 != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOSlot.Preserve(ref array[j]);\n\t\t\t\t\t\t\tSprayCan.IOPreserveInfo target = default(SprayCan.IOPreserveInfo);\n\t\t\t\t\t\t\tiOEntity2.inputs[iOSlot.connectedToSlot].Preserve(ref target);\n\t\t\t\t\t\t\tlist.Add(new SprayCan.OtherEntityPreserveInfo\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinfo = target,\n\t\t\t\t\t\t\t\tconnectedEntity = iOEntity2,\n\t\t\t\t\t\t\t\tindex = iOSlot.connectedToSlot,\n\t\t\t\t\t\t\t\tisOutput = false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tarray2 = new SprayCan.IOPreserveInfo[iOEntity.inputs.Length];\n\t\t\t\t\tfor (int k = 0; k < iOEntity.inputs.Length; k++)\n\t\t\t\t\t{\n\t\t\t\t\t\tIOEntity.IOSlot iOSlot2 = iOEntity.inputs[k];\n\t\t\t\t\t\tIOEntity iOEntity3 = iOSlot2.connectedTo.Get();\n\t\t\t\t\t\tif (iOEntity3 != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOSlot2.Preserve(ref array2[k]);\n\t\t\t\t\t\t\tSprayCan.IOPreserveInfo target2 = default(SprayCan.IOPreserveInfo);\n\t\t\t\t\t\t\tiOEntity3.outputs[iOSlot2.connectedToSlot].Preserve(ref target2);\n\t\t\t\t\t\t\tlist.Add(new SprayCan.OtherEntityPreserveInfo\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinfo = target2,\n\t\t\t\t\t\t\t\tconnectedEntity = iOEntity3,\n\t\t\t\t\t\t\t\tindex = iOSlot2.connectedToSlot,\n\t\t\t\t\t\t\t\tisOutput = true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbaseEntity2.Kill();\n\t\t\t\tbaseEntity2 = GameManager.server.CreateEntity(resourcePath, (baseEntity4 != null) ? baseEntity4.transform.TransformPoint(localPosition) : localPosition, (baseEntity4 != null) ? (baseEntity4.transform.rotation * localRotation) : localRotation);\n\t\t\t\tbaseEntity2.SetParent(baseEntity4);\n\t\t\t\tbaseEntity2.transform.localPosition = localPosition;\n\t\t\t\tbaseEntity2.transform.localRotation = localRotation;\n\t\t\t\tbaseEntity2.OwnerID = ownerID;\n\t\t\t\tif (GetItemDefinitionForEntity(baseEntity2, out var def2, useRedirect: false) && def2.isRedirectOf != null)\n\t\t\t\t{\n\t\t\t\t\tbaseEntity2.skinID = 0uL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbaseEntity2.skinID = num;\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is DecayEntity decayEntity2)\n\t\t\t\t{\n\t\t\t\t\tdecayEntity2.AttachToBuilding(null);\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is PlanterBox planterBox2)\n\t\t\t\t{\n\t\t\t\t\tplanterBox2.soilSaturation = soilSaturation;\n\t\t\t\t\tSprinkler.SplashableGrid.RegisterEntity(planterBox2);\n\t\t\t\t}\n\t\t\t\tbaseEntity2.Spawn();\n\t\t\t\tif (baseEntity2 is IOEntity iOEntity4)\n\t\t\t\t{\n\t\t\t\t\tif (array != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int l = 0; l < iOEntity4.outputs.Length; l++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOEntity4.outputs[l].Restore(array[l]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (array2 != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int m = 0; m < iOEntity4.inputs.Length; m++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (array2[m].connectedTo != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tiOEntity4.inputs[m].Restore(array2[m]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tusing PooledList<IOEntity> pooledList = Facepunch.Pool.Get<PooledList<IOEntity>>();\n\t\t\t\t\tforeach (SprayCan.OtherEntityPreserveInfo item2 in list)\n\t\t\t\t\t{\n\t\t\t\t\t\tSprayCan.IOPreserveInfo info = item2.info;\n\t\t\t\t\t\tinfo.connectedTo = iOEntity4;\n\t\t\t\t\t\tif (item2.connectedEntity != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (item2.isOutput)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titem2.connectedEntity.outputs[item2.index].Restore(info);\n\t\t\t\t\t\t\t\tpooledList.Add(item2.connectedEntity);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titem2.connectedEntity.inputs[item2.index].Restore(info);\n\t\t\t\t\t\t\t\tpooledList.Add(item2.connectedEntity);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tforeach (IOEntity item3 in pooledList)\n\t\t\t\t\t{\n\t\t\t\t\t\titem3.SendNetworkUpdate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is BaseCombatEntity baseCombatEntity2)\n\t\t\t\t{\n\t\t\t\t\tbaseCombatEntity2.SetHealth(health);\n\t\t\t\t\tbaseCombatEntity2.lastAttackedTime = lastAttackedTime;\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is BuildingPrivlidge buildingPrivlidge2 && hashSet != null)\n\t\t\t\t{\n\t\t\t\t\tbuildingPrivlidge2.authorizedPlayers = hashSet;\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is CodeLock codeLock2)\n\t\t\t\t{\n\t\t\t\t\tbaseEntity4.SetSlot(BaseEntity.Slot.Lock, codeLock2);\n\t\t\t\t\tcodeLock2.SetParent(baseEntity4, baseEntity4.GetSlotAnchorName(BaseEntity.Slot.Lock));\n\t\t\t\t\tcodeLock2.code = codeLockPreserveInfo.code;\n\t\t\t\t\tcodeLock2.guestCode = codeLockPreserveInfo.guestCode;\n\t\t\t\t\tcodeLock2.SetFlag(BaseEntity.Flags.Locked, codeLockPreserveInfo.isLocked);\n\t\t\t\t\tcodeLock2.whitelistPlayers.AddRange(codeLockPreserveInfo.whitelistPlayers);\n\t\t\t\t\tcodeLock2.guestPlayers.AddRange(codeLockPreserveInfo.guestPlayers);\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref codeLockPreserveInfo.whitelistPlayers);\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref codeLockPreserveInfo.guestPlayers);\n\t\t\t\t}\n\t\t\t\tif (dictionary2.Count > 0)\n\t\t\t\t{\n\t\t\t\t\tRestoreEntityStorage(baseEntity2, 0, dictionary2);\n\t\t\t\t\tif (!flag2)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int n = 0; n < baseEntity2.children.Count; n++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRestoreEntityStorage(baseEntity2.children[n], -1, dictionary2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tforeach (System.Collections.Generic.KeyValuePair<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> item4 in dictionary2)\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (Item item5 in item4.Value)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUnityEngine.Debug.Log($\"Deleting {item5} as it has no new container\");\n\t\t\t\t\t\t\titem5.Remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnEntitySkinChanged(msg.player, baseNetworkable, targetSkin);\n\t\t\t\t}\n\t\t\t\tif (flag2)\n\t\t\t\t{\n\t\t\t\t\tforeach (SprayCan.ChildPreserveInfo item6 in obj)\n\t\t\t\t\t{\n\t\t\t\t\t\tbool flag3 = false;\n\t\t\t\t\t\titem6.TargetEntity.SetParent(baseEntity2, item6.TargetBone, worldPositionStays: true);\n\t\t\t\t\t\titem6.TargetEntity.transform.localPosition = item6.LocalPosition;\n\t\t\t\t\t\titem6.TargetEntity.transform.localRotation = item6.LocalRotation;\n\t\t\t\t\t\tif (ConVar.Server.repositionAttachmentsOnReskin && baseEntity2 is BoxStorage)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSocket_Base[] array3 = PrefabAttribute.server.FindAll<Socket_Base>(baseEntity2.prefabID);\n\t\t\t\t\t\t\tSocket_Specific socket_Specific = PrefabAttribute.server.Find<Socket_Base>(item6.TargetEntity.prefabID) as Socket_Specific;\n\t\t\t\t\t\t\tSocket_Specific_Female socket_Specific_Female = null;\n\t\t\t\t\t\t\tfloat num2 = float.MaxValue;\n\t\t\t\t\t\t\tSocket_Base[] array4 = array3;\n\t\t\t\t\t\t\tforeach (Socket_Base socket_Base in array4)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (socket_Base is Socket_Specific_Female socket_Specific_Female2 && socket_Specific != null && System.Linq.Enumerable.Contains(socket_Specific_Female2.allowedMaleSockets, socket_Specific.targetSocketName))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tUnityEngine.Vector3 b = baseEntity2.transform.position + baseEntity2.transform.rotation * socket_Base.worldPosition;\n\t\t\t\t\t\t\t\t\tfloat num4 = UnityEngine.Vector3.Distance(item6.TargetEntity.transform.position, b);\n\t\t\t\t\t\t\t\t\tif (num4 < num2 && UnityEngine.Vector3.Angle(baseEntity2.transform.TransformDirection(socket_Base.worldForward), item6.TargetEntity.transform.forward) < 5f)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsocket_Specific_Female = socket_Specific_Female2;\n\t\t\t\t\t\t\t\t\t\tnum2 = num4;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (socket_Specific_Female != null && item6.TargetEntity is IOEntity iOEntity5 && num2 > 0.05f)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSystem.Collections.Generic.Dictionary<int, UnityEngine.Vector3> dictionary3 = new System.Collections.Generic.Dictionary<int, UnityEngine.Vector3>();\n\t\t\t\t\t\t\t\tfor (int num5 = 0; num5 < iOEntity5.outputs.Length; num5++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tIOEntity.IOSlot iOSlot3 = iOEntity5.outputs[num5];\n\t\t\t\t\t\t\t\t\tif (iOSlot3.IsConnected() && iOSlot3.linePoints.Length != 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdictionary3.Add(num5, iOEntity5.transform.TransformPoint(iOSlot3.linePoints[0]));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\titem6.TargetEntity.transform.localPosition = socket_Specific_Female.worldPosition;\n\t\t\t\t\t\t\t\tforeach (System.Collections.Generic.KeyValuePair<int, UnityEngine.Vector3> item7 in dictionary3)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tiOEntity5.outputs[item7.Key].linePoints[0] = iOEntity5.transform.InverseTransformPoint(item7.Value);\n\t\t\t\t\t\t\t\t\tflag3 = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tIOEntity.IOSlot[] inputs = iOEntity5.inputs;\n\t\t\t\t\t\t\t\tforeach (IOEntity.IOSlot iOSlot4 in inputs)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (iOSlot4.IsConnected())\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tIOEntity iOEntity6 = iOSlot4.connectedTo.Get();\n\t\t\t\t\t\t\t\t\t\tiOEntity6.outputs[iOSlot4.connectedToSlot].linePoints[0] = iOEntity6.transform.InverseTransformPoint(iOEntity5.transform.TransformPoint(iOSlot4.handlePosition));\n\t\t\t\t\t\t\t\t\t\tiOEntity6.SendNetworkUpdateImmediate();\n\t\t\t\t\t\t\t\t\t\tiOEntity6.NotifyClientsLineChanged();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\titem6.TargetEntity.SendNetworkUpdateImmediate();\n\t\t\t\t\t\tif (flag3 && item6.TargetEntity is IOEntity iOEntity7)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOEntity7.NotifyClientsLineChanged();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbaseEntity2.SetSlots(slots);\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t\t\tif (baseEntity2 is ISprayCallback sprayCallback)\n\t\t\t\t{\n\t\t\t\t\tsprayCallback.OnReskinned(msg.player);\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is DecayEntity decayEntity3 && !flag)\n\t\t\t\t{\n\t\t\t\t\tdecayEntity3.StopBeingDemolishable();\n\t\t\t\t}\n\t\t\t}\n\t\t\tOxide.Core.Interface.CallHook(\"OnEntityReskinned\", baseEntity2, skin, msg.player);\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_ReskinResult\"), 1, baseEntity2.net.ID);\n\t\t}\n\t}\n\tif (!base.UsingInfiniteAmmoCheat)\n\t{\n\t\tLoseCondition(ConditionLossPerReskin);\n\t}\n\tClientRPC(RpcTarget.NetworkGroup(\"Client_ChangeSprayColour\"), -1);\n\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\tInvoke(ClearBusy, SprayCooldown);\n\tvoid FailResponse(SprayCan.SprayFailReason reason)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_ReskinResult\"), 0, (int)reason);\n\t}\n\tstatic void RestoreEntityStorage(BaseEntity baseEntity, int index, System.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> copy)\n\t{\n\t\tif (baseEntity is IItemContainerEntity itemContainerEntity2)\n\t\t{\n\t\t\tSprayCan.ContainerSet containerSet2 = default(SprayCan.ContainerSet);\n\t\t\tcontainerSet2.ContainerIndex = index;\n\t\t\tcontainerSet2.PrefabId = ((index != 0) ? baseEntity.prefabID : 0u);\n\t\t\tSprayCan.ContainerSet key2 = containerSet2;\n\t\t\tif (copy.ContainsKey(key2))\n\t\t\t{\n\t\t\t\tforeach (Item item8 in copy[key2])\n\t\t\t\t{\n\t\t\t\t\titem8.MoveToContainer(itemContainerEntity2.inventory);\n\t\t\t\t}\n\t\t\t\tcopy.Remove(key2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic void SaveEntityStorage(BaseEntity baseEntity, System.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> dictionary, int index)\n\t{\n\t\tif (baseEntity is IItemContainerEntity itemContainerEntity)\n\t\t{\n\t\t\tSprayCan.ContainerSet containerSet = default(SprayCan.ContainerSet);\n\t\t\tcontainerSet.ContainerIndex = index;\n\t\t\tcontainerSet.PrefabId = ((index != 0) ? baseEntity.prefabID : 0u);\n\t\t\tSprayCan.ContainerSet key = containerSet;\n\t\t\tif (!dictionary.ContainsKey(key))\n\t\t\t{\n\t\t\t\tdictionary.Add(key, new System.Collections.Generic.List<Item>());\n\t\t\t\tforeach (Item item9 in itemContainerEntity.inventory.itemList)\n\t\t\t\t{\n\t\t\t\t\tdictionary[key].Add(item9);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tforeach (Item item10 in dictionary[key])\n\t\t\t\t\t{\n\t\t\t\t\t\titem10.RemoveFromContainer();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tUnityEngine.Debug.Log(\"Multiple containers with the same prefab id being added during vehicle reskin\");\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseEntity local3, ItemSkinDirectory.Skin local7, BasePlayer player",
      "TargetName": "SprayCan",
      "MethodName": "ChangeItemSkin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3335109763,
      "Name": "OnEntityReskinned",
      "FullName": "OnEntityReskinned",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "local3",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "ItemSkinDirectory+Skin",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an entity is reskinned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\nprivate void ChangeItemSkin(BaseEntity.RPCMessage msg)\n{\n\tNetworkableId uid = msg.read.EntityID();\n\tint targetSkin = msg.read.Int32();\n\tBaseNetworkable baseNetworkable = BaseNetworkable.serverEntities.Find(uid);\n\tif (!ValidateEntityAndSkin(msg.player, baseNetworkable, targetSkin))\n\t{\n\t\treturn;\n\t}\n\tif (baseNetworkable != null)\n\t{\n\t\tBaseEntity baseEntity2 = baseNetworkable as BaseEntity;\n\t\tif ((object)baseEntity2 != null)\n\t\t{\n\t\t\tif (!GetItemDefinitionForEntity(baseEntity2, out var def, useRedirect: false))\n\t\t\t{\n\t\t\t\tFailResponse(SprayCan.SprayFailReason.InvalidItem);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tItemDefinition itemDefinition = null;\n\t\t\tulong num = ItemDefinition.FindSkin((def.isRedirectOf != null) ? def.isRedirectOf.itemid : def.itemid, targetSkin);\n\t\t\tItemSkinDirectory.Skin skin = System.Linq.Enumerable.FirstOrDefault(((def.isRedirectOf != null) ? def.isRedirectOf : def).skins, (ItemSkinDirectory.Skin x) => x.id == targetSkin);\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnEntityReskin\", baseEntity2, skin, msg.player) != null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (skin.invItem != null && skin.invItem is ItemSkin itemSkin)\n\t\t\t{\n\t\t\t\tif (itemSkin.Redirect != null)\n\t\t\t\t{\n\t\t\t\t\titemDefinition = itemSkin.Redirect;\n\t\t\t\t}\n\t\t\t\telse if ((bool)def && def.isRedirectOf != null)\n\t\t\t\t{\n\t\t\t\t\titemDefinition = def.isRedirectOf;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (def.isRedirectOf != null || ((bool)def && def.isRedirectOf != null))\n\t\t\t{\n\t\t\t\titemDefinition = def.isRedirectOf;\n\t\t\t}\n\t\t\tif (itemDefinition == null)\n\t\t\t{\n\t\t\t\tbaseEntity2.skinID = num;\n\t\t\t\tbaseEntity2.SendNetworkUpdate();\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnEntitySkinChanged(msg.player, baseNetworkable, targetSkin);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif (!CanEntityBeRespawned(baseEntity2, out var reason2, out var culpritPlayer))\n\t\t\t\t{\n\t\t\t\t\tif (reason2 == SprayCan.SprayFailReason.MountedBlocked)\n\t\t\t\t\t{\n\t\t\t\t\t\tlastSprayError = string.Format(PlayerIsMounted.translated, NameHelper.GetPlayerNameStreamSafe(msg.player, culpritPlayer));\n\t\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, lastSprayError, false);\n\t\t\t\t\t}\n\t\t\t\t\tFailResponse(reason2);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!GetEntityPrefabPath(itemDefinition, out var resourcePath))\n\t\t\t\t{\n\t\t\t\t\tUnityEngine.Debug.LogWarning(\"Cannot find resource path of redirect entity to spawn! \" + itemDefinition.gameObject.name);\n\t\t\t\t\tFailResponse(SprayCan.SprayFailReason.InvalidItem);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (global::SimpleUpgrade.IsUpgradeBlocked(baseEntity2, itemDefinition, msg.player))\n\t\t\t\t{\n\t\t\t\t\tif (DeployVolume.LastDeployHit != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tBaseEntity baseEntity3 = UnityEngine.GameObjectEx.ToBaseEntity(DeployVolume.LastDeployHit);\n\t\t\t\t\t\tif (baseEntity3 != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tmsg.player.ShowBlockedByEntityToast(baseEntity3, Construction.lastPlacementError);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, Construction.lastPlacementError, false);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tSprayCan.CodeLockPreserveInfo codeLockPreserveInfo = default(SprayCan.CodeLockPreserveInfo);\n\t\t\t\tif (baseEntity2 is CodeLock codeLock)\n\t\t\t\t{\n\t\t\t\t\tcodeLockPreserveInfo.code = codeLock.code;\n\t\t\t\t\tcodeLockPreserveInfo.guestCode = codeLock.guestCode;\n\t\t\t\t\tcodeLockPreserveInfo.isLocked = codeLock.IsLocked();\n\t\t\t\t\tcodeLockPreserveInfo.whitelistPlayers = Facepunch.Pool.Get<System.Collections.Generic.List<ulong>>();\n\t\t\t\t\tcodeLockPreserveInfo.guestPlayers = Facepunch.Pool.Get<System.Collections.Generic.List<ulong>>();\n\t\t\t\t\tcodeLockPreserveInfo.whitelistPlayers.AddRange(codeLock.whitelistPlayers);\n\t\t\t\t\tcodeLockPreserveInfo.guestPlayers.AddRange(codeLock.guestPlayers);\n\t\t\t\t}\n\t\t\t\tUnityEngine.Vector3 localPosition = baseEntity2.transform.localPosition;\n\t\t\t\tUnityEngine.Quaternion localRotation = baseEntity2.transform.localRotation;\n\t\t\t\tBaseEntity baseEntity4 = baseEntity2.GetParentEntity();\n\t\t\t\tfloat health = baseEntity2.Health();\n\t\t\t\tEntityRef[] slots = baseEntity2.GetSlots();\n\t\t\t\tulong ownerID = baseEntity2.OwnerID;\n\t\t\t\tfloat lastAttackedTime = ((baseEntity2 is BaseCombatEntity baseCombatEntity) ? baseCombatEntity.lastAttackedTime : 0f);\n\t\t\t\tint soilSaturation = ((baseEntity2 is PlanterBox planterBox) ? planterBox.soilSaturation : 0);\n\t\t\t\tbool flag = baseEntity2 is DecayEntity decayEntity && decayEntity.HasFlag(BaseEntity.Flags.Reserved2);\n\t\t\t\tSystem.Collections.Generic.HashSet<ulong> hashSet = null;\n\t\t\t\tif (baseEntity2 is BuildingPrivlidge buildingPrivlidge)\n\t\t\t\t{\n\t\t\t\t\thashSet = new System.Collections.Generic.HashSet<ulong>(buildingPrivlidge.authorizedPlayers);\n\t\t\t\t}\n\t\t\t\tbool flag2 = baseEntity2 is Door || baseEntity2 is BuildingPrivlidge || baseEntity2 is BoxStorage || baseEntity2 is PlanterBox;\n\t\t\t\tSystem.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> dictionary2 = new System.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>>();\n\t\t\t\tSaveEntityStorage(baseEntity2, dictionary2, 0);\n\t\t\t\tSystem.Collections.Generic.List<SprayCan.ChildPreserveInfo> obj = Facepunch.Pool.Get<System.Collections.Generic.List<SprayCan.ChildPreserveInfo>>();\n\t\t\t\tif (flag2)\n\t\t\t\t{\n\t\t\t\t\tforeach (BaseEntity child in baseEntity2.children)\n\t\t\t\t\t{\n\t\t\t\t\t\tobj.Add(new SprayCan.ChildPreserveInfo\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tTargetEntity = child,\n\t\t\t\t\t\t\tTargetBone = child.parentBone,\n\t\t\t\t\t\t\tLocalPosition = child.transform.localPosition,\n\t\t\t\t\t\t\tLocalRotation = child.transform.localRotation\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tforeach (SprayCan.ChildPreserveInfo item in obj)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.TargetEntity.SetParent(null, worldPositionStays: true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor (int i = 0; i < baseEntity2.children.Count; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tSaveEntityStorage(baseEntity2.children[i], dictionary2, -1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tSprayCan.IOPreserveInfo[] array = null;\n\t\t\t\tSprayCan.IOPreserveInfo[] array2 = null;\n\t\t\t\tSystem.Collections.Generic.List<SprayCan.OtherEntityPreserveInfo> list = new System.Collections.Generic.List<SprayCan.OtherEntityPreserveInfo>();\n\t\t\t\tif (baseEntity2 is IOEntity iOEntity)\n\t\t\t\t{\n\t\t\t\t\tarray = new SprayCan.IOPreserveInfo[iOEntity.outputs.Length];\n\t\t\t\t\tfor (int j = 0; j < iOEntity.outputs.Length; j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tIOEntity.IOSlot iOSlot = iOEntity.outputs[j];\n\t\t\t\t\t\tIOEntity iOEntity2 = iOSlot.connectedTo.Get();\n\t\t\t\t\t\tif (iOEntity2 != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOSlot.Preserve(ref array[j]);\n\t\t\t\t\t\t\tSprayCan.IOPreserveInfo target = default(SprayCan.IOPreserveInfo);\n\t\t\t\t\t\t\tiOEntity2.inputs[iOSlot.connectedToSlot].Preserve(ref target);\n\t\t\t\t\t\t\tlist.Add(new SprayCan.OtherEntityPreserveInfo\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinfo = target,\n\t\t\t\t\t\t\t\tconnectedEntity = iOEntity2,\n\t\t\t\t\t\t\t\tindex = iOSlot.connectedToSlot,\n\t\t\t\t\t\t\t\tisOutput = false\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tarray2 = new SprayCan.IOPreserveInfo[iOEntity.inputs.Length];\n\t\t\t\t\tfor (int k = 0; k < iOEntity.inputs.Length; k++)\n\t\t\t\t\t{\n\t\t\t\t\t\tIOEntity.IOSlot iOSlot2 = iOEntity.inputs[k];\n\t\t\t\t\t\tIOEntity iOEntity3 = iOSlot2.connectedTo.Get();\n\t\t\t\t\t\tif (iOEntity3 != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOSlot2.Preserve(ref array2[k]);\n\t\t\t\t\t\t\tSprayCan.IOPreserveInfo target2 = default(SprayCan.IOPreserveInfo);\n\t\t\t\t\t\t\tiOEntity3.outputs[iOSlot2.connectedToSlot].Preserve(ref target2);\n\t\t\t\t\t\t\tlist.Add(new SprayCan.OtherEntityPreserveInfo\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tinfo = target2,\n\t\t\t\t\t\t\t\tconnectedEntity = iOEntity3,\n\t\t\t\t\t\t\t\tindex = iOSlot2.connectedToSlot,\n\t\t\t\t\t\t\t\tisOutput = true\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbaseEntity2.Kill();\n\t\t\t\tbaseEntity2 = GameManager.server.CreateEntity(resourcePath, (baseEntity4 != null) ? baseEntity4.transform.TransformPoint(localPosition) : localPosition, (baseEntity4 != null) ? (baseEntity4.transform.rotation * localRotation) : localRotation);\n\t\t\t\tbaseEntity2.SetParent(baseEntity4);\n\t\t\t\tbaseEntity2.transform.localPosition = localPosition;\n\t\t\t\tbaseEntity2.transform.localRotation = localRotation;\n\t\t\t\tbaseEntity2.OwnerID = ownerID;\n\t\t\t\tif (GetItemDefinitionForEntity(baseEntity2, out var def2, useRedirect: false) && def2.isRedirectOf != null)\n\t\t\t\t{\n\t\t\t\t\tbaseEntity2.skinID = 0uL;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbaseEntity2.skinID = num;\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is DecayEntity decayEntity2)\n\t\t\t\t{\n\t\t\t\t\tdecayEntity2.AttachToBuilding(null);\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is PlanterBox planterBox2)\n\t\t\t\t{\n\t\t\t\t\tplanterBox2.soilSaturation = soilSaturation;\n\t\t\t\t\tSprinkler.SplashableGrid.RegisterEntity(planterBox2);\n\t\t\t\t}\n\t\t\t\tbaseEntity2.Spawn();\n\t\t\t\tif (baseEntity2 is IOEntity iOEntity4)\n\t\t\t\t{\n\t\t\t\t\tif (array != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int l = 0; l < iOEntity4.outputs.Length; l++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOEntity4.outputs[l].Restore(array[l]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (array2 != null)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int m = 0; m < iOEntity4.inputs.Length; m++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (array2[m].connectedTo != null)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tiOEntity4.inputs[m].Restore(array2[m]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tusing PooledList<IOEntity> pooledList = Facepunch.Pool.Get<PooledList<IOEntity>>();\n\t\t\t\t\tforeach (SprayCan.OtherEntityPreserveInfo item2 in list)\n\t\t\t\t\t{\n\t\t\t\t\t\tSprayCan.IOPreserveInfo info = item2.info;\n\t\t\t\t\t\tinfo.connectedTo = iOEntity4;\n\t\t\t\t\t\tif (item2.connectedEntity != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (item2.isOutput)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titem2.connectedEntity.outputs[item2.index].Restore(info);\n\t\t\t\t\t\t\t\tpooledList.Add(item2.connectedEntity);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\titem2.connectedEntity.inputs[item2.index].Restore(info);\n\t\t\t\t\t\t\t\tpooledList.Add(item2.connectedEntity);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tforeach (IOEntity item3 in pooledList)\n\t\t\t\t\t{\n\t\t\t\t\t\titem3.SendNetworkUpdate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is BaseCombatEntity baseCombatEntity2)\n\t\t\t\t{\n\t\t\t\t\tbaseCombatEntity2.SetHealth(health);\n\t\t\t\t\tbaseCombatEntity2.lastAttackedTime = lastAttackedTime;\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is BuildingPrivlidge buildingPrivlidge2 && hashSet != null)\n\t\t\t\t{\n\t\t\t\t\tbuildingPrivlidge2.authorizedPlayers = hashSet;\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is CodeLock codeLock2)\n\t\t\t\t{\n\t\t\t\t\tbaseEntity4.SetSlot(BaseEntity.Slot.Lock, codeLock2);\n\t\t\t\t\tcodeLock2.SetParent(baseEntity4, baseEntity4.GetSlotAnchorName(BaseEntity.Slot.Lock));\n\t\t\t\t\tcodeLock2.code = codeLockPreserveInfo.code;\n\t\t\t\t\tcodeLock2.guestCode = codeLockPreserveInfo.guestCode;\n\t\t\t\t\tcodeLock2.SetFlag(BaseEntity.Flags.Locked, codeLockPreserveInfo.isLocked);\n\t\t\t\t\tcodeLock2.whitelistPlayers.AddRange(codeLockPreserveInfo.whitelistPlayers);\n\t\t\t\t\tcodeLock2.guestPlayers.AddRange(codeLockPreserveInfo.guestPlayers);\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref codeLockPreserveInfo.whitelistPlayers);\n\t\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref codeLockPreserveInfo.guestPlayers);\n\t\t\t\t}\n\t\t\t\tif (dictionary2.Count > 0)\n\t\t\t\t{\n\t\t\t\t\tRestoreEntityStorage(baseEntity2, 0, dictionary2);\n\t\t\t\t\tif (!flag2)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor (int n = 0; n < baseEntity2.children.Count; n++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tRestoreEntityStorage(baseEntity2.children[n], -1, dictionary2);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tforeach (System.Collections.Generic.KeyValuePair<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> item4 in dictionary2)\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (Item item5 in item4.Value)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUnityEngine.Debug.Log($\"Deleting {item5} as it has no new container\");\n\t\t\t\t\t\t\titem5.Remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnEntitySkinChanged(msg.player, baseNetworkable, targetSkin);\n\t\t\t\t}\n\t\t\t\tif (flag2)\n\t\t\t\t{\n\t\t\t\t\tforeach (SprayCan.ChildPreserveInfo item6 in obj)\n\t\t\t\t\t{\n\t\t\t\t\t\tbool flag3 = false;\n\t\t\t\t\t\titem6.TargetEntity.SetParent(baseEntity2, item6.TargetBone, worldPositionStays: true);\n\t\t\t\t\t\titem6.TargetEntity.transform.localPosition = item6.LocalPosition;\n\t\t\t\t\t\titem6.TargetEntity.transform.localRotation = item6.LocalRotation;\n\t\t\t\t\t\tif (ConVar.Server.repositionAttachmentsOnReskin && baseEntity2 is BoxStorage)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tSocket_Base[] array3 = PrefabAttribute.server.FindAll<Socket_Base>(baseEntity2.prefabID);\n\t\t\t\t\t\t\tSocket_Specific socket_Specific = PrefabAttribute.server.Find<Socket_Base>(item6.TargetEntity.prefabID) as Socket_Specific;\n\t\t\t\t\t\t\tSocket_Specific_Female socket_Specific_Female = null;\n\t\t\t\t\t\t\tfloat num2 = float.MaxValue;\n\t\t\t\t\t\t\tSocket_Base[] array4 = array3;\n\t\t\t\t\t\t\tforeach (Socket_Base socket_Base in array4)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (socket_Base is Socket_Specific_Female socket_Specific_Female2 && socket_Specific != null && System.Linq.Enumerable.Contains(socket_Specific_Female2.allowedMaleSockets, socket_Specific.targetSocketName))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tUnityEngine.Vector3 b = baseEntity2.transform.position + baseEntity2.transform.rotation * socket_Base.worldPosition;\n\t\t\t\t\t\t\t\t\tfloat num4 = UnityEngine.Vector3.Distance(item6.TargetEntity.transform.position, b);\n\t\t\t\t\t\t\t\t\tif (num4 < num2 && UnityEngine.Vector3.Angle(baseEntity2.transform.TransformDirection(socket_Base.worldForward), item6.TargetEntity.transform.forward) < 5f)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsocket_Specific_Female = socket_Specific_Female2;\n\t\t\t\t\t\t\t\t\t\tnum2 = num4;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (socket_Specific_Female != null && item6.TargetEntity is IOEntity iOEntity5 && num2 > 0.05f)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tSystem.Collections.Generic.Dictionary<int, UnityEngine.Vector3> dictionary3 = new System.Collections.Generic.Dictionary<int, UnityEngine.Vector3>();\n\t\t\t\t\t\t\t\tfor (int num5 = 0; num5 < iOEntity5.outputs.Length; num5++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tIOEntity.IOSlot iOSlot3 = iOEntity5.outputs[num5];\n\t\t\t\t\t\t\t\t\tif (iOSlot3.IsConnected() && iOSlot3.linePoints.Length != 0)\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tdictionary3.Add(num5, iOEntity5.transform.TransformPoint(iOSlot3.linePoints[0]));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\titem6.TargetEntity.transform.localPosition = socket_Specific_Female.worldPosition;\n\t\t\t\t\t\t\t\tforeach (System.Collections.Generic.KeyValuePair<int, UnityEngine.Vector3> item7 in dictionary3)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tiOEntity5.outputs[item7.Key].linePoints[0] = iOEntity5.transform.InverseTransformPoint(item7.Value);\n\t\t\t\t\t\t\t\t\tflag3 = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tIOEntity.IOSlot[] inputs = iOEntity5.inputs;\n\t\t\t\t\t\t\t\tforeach (IOEntity.IOSlot iOSlot4 in inputs)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tif (iOSlot4.IsConnected())\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tIOEntity iOEntity6 = iOSlot4.connectedTo.Get();\n\t\t\t\t\t\t\t\t\t\tiOEntity6.outputs[iOSlot4.connectedToSlot].linePoints[0] = iOEntity6.transform.InverseTransformPoint(iOEntity5.transform.TransformPoint(iOSlot4.handlePosition));\n\t\t\t\t\t\t\t\t\t\tiOEntity6.SendNetworkUpdateImmediate();\n\t\t\t\t\t\t\t\t\t\tiOEntity6.NotifyClientsLineChanged();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\titem6.TargetEntity.SendNetworkUpdateImmediate();\n\t\t\t\t\t\tif (flag3 && item6.TargetEntity is IOEntity iOEntity7)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiOEntity7.NotifyClientsLineChanged();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbaseEntity2.SetSlots(slots);\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t\t\tif (baseEntity2 is ISprayCallback sprayCallback)\n\t\t\t\t{\n\t\t\t\t\tsprayCallback.OnReskinned(msg.player);\n\t\t\t\t}\n\t\t\t\tif (baseEntity2 is DecayEntity decayEntity3 && !flag)\n\t\t\t\t{\n\t\t\t\t\tdecayEntity3.StopBeingDemolishable();\n\t\t\t\t}\n\t\t\t}\n\t\t\tOxide.Core.Interface.CallHook(\"OnEntityReskinned\", baseEntity2, skin, msg.player);\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_ReskinResult\"), 1, baseEntity2.net.ID);\n\t\t}\n\t}\n\tif (!base.UsingInfiniteAmmoCheat)\n\t{\n\t\tLoseCondition(ConditionLossPerReskin);\n\t}\n\tClientRPC(RpcTarget.NetworkGroup(\"Client_ChangeSprayColour\"), -1);\n\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\tInvoke(ClearBusy, SprayCooldown);\n\tvoid FailResponse(SprayCan.SprayFailReason reason)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_ReskinResult\"), 0, (int)reason);\n\t}\n\tstatic void RestoreEntityStorage(BaseEntity baseEntity, int index, System.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> copy)\n\t{\n\t\tif (baseEntity is IItemContainerEntity itemContainerEntity2)\n\t\t{\n\t\t\tSprayCan.ContainerSet containerSet2 = default(SprayCan.ContainerSet);\n\t\t\tcontainerSet2.ContainerIndex = index;\n\t\t\tcontainerSet2.PrefabId = ((index != 0) ? baseEntity.prefabID : 0u);\n\t\t\tSprayCan.ContainerSet key2 = containerSet2;\n\t\t\tif (copy.ContainsKey(key2))\n\t\t\t{\n\t\t\t\tforeach (Item item8 in copy[key2])\n\t\t\t\t{\n\t\t\t\t\titem8.MoveToContainer(itemContainerEntity2.inventory);\n\t\t\t\t}\n\t\t\t\tcopy.Remove(key2);\n\t\t\t}\n\t\t}\n\t}\n\tstatic void SaveEntityStorage(BaseEntity baseEntity, System.Collections.Generic.Dictionary<SprayCan.ContainerSet, System.Collections.Generic.List<Item>> dictionary, int index)\n\t{\n\t\tif (baseEntity is IItemContainerEntity itemContainerEntity)\n\t\t{\n\t\t\tSprayCan.ContainerSet containerSet = default(SprayCan.ContainerSet);\n\t\t\tcontainerSet.ContainerIndex = index;\n\t\t\tcontainerSet.PrefabId = ((index != 0) ? baseEntity.prefabID : 0u);\n\t\t\tSprayCan.ContainerSet key = containerSet;\n\t\t\tif (!dictionary.ContainsKey(key))\n\t\t\t{\n\t\t\t\tdictionary.Add(key, new System.Collections.Generic.List<Item>());\n\t\t\t\tforeach (Item item9 in itemContainerEntity.inventory.itemList)\n\t\t\t\t{\n\t\t\t\t\tdictionary[key].Add(item9);\n\t\t\t\t}\n\t\t\t\t{\n\t\t\t\t\tforeach (Item item10 in dictionary[key])\n\t\t\t\t\t{\n\t\t\t\t\t\titem10.RemoveFromContainer();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tUnityEngine.Debug.Log(\"Multiple containers with the same prefab id being added during vehicle reskin\");\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseEntity local3, ItemSkinDirectory.Skin local7, BasePlayer player",
      "TargetName": "SprayCan",
      "MethodName": "ChangeItemSkin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 777087196,
      "Name": "OnSprayCreate",
      "FullName": "OnSprayCreate",
      "Category": "Crafting",
      "Parameters": [
        {
          "name": "sprayCan",
          "typeName": "SprayCan",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "UnityEngine.Quaternion",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a spray is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.InputValidation(new System.Type[]\n{\n\ttypeof(UnityEngine.Vector3),\n\ttypeof(UnityEngine.Vector3),\n\ttypeof(UnityEngine.Vector3),\n\ttypeof(int)\n})]\nprivate void CreateSpray(BaseEntity.RPCMessage msg)\n{\n\tif (IsBusy())\n\t{\n\t\treturn;\n\t}\n\tClientRPC(RpcTarget.NetworkGroup(\"Client_ChangeSprayColour\"), -1);\n\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\tInvoke(ClearBusy, SprayCooldown);\n\tUnityEngine.Vector3 vector = msg.read.Vector3();\n\tUnityEngine.Vector3 vector2 = msg.read.Vector3();\n\tUnityEngine.Vector3 point = msg.read.Vector3();\n\tint num = msg.read.Int32();\n\tif (UnityEngine.Vector3.Distance(vector, base.transform.position) > 4.5f)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Quaternion quaternion = UnityEngine.Quaternion.LookRotation((new UnityEngine.Plane(vector2, vector).ClosestPointOnPlane(point) - vector).normalized, vector2);\n\tquaternion *= UnityEngine.Quaternion.Euler(0f, 0f, 90f);\n\tif (num != 0 && !msg.player.blueprints.CheckSkinOwnership(num, msg.player))\n\t{\n\t\tUnityEngine.Debug.Log($\"SprayCan.ChangeItemSkin player does not have item :{num}:\");\n\t}\n\telse if (Oxide.Core.Interface.CallHook(\"OnSprayCreate\", this, vector, quaternion) == null)\n\t{\n\t\tulong num2 = ItemDefinition.FindSkin(SprayDecalItem.itemid, num);\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(SprayDecalEntityRef.resourcePath, vector, quaternion);\n\t\tbaseEntity.skinID = num2;\n\t\tbaseEntity.OnDeployed(null, GetOwnerPlayer(), GetItem());\n\t\tbaseEntity.Spawn();\n\t\tCheckAchievementPosition(vector);\n\t\tif (!base.UsingInfiniteAmmoCheat)\n\t\t{\n\t\t\tLoseCondition(ConditionLossPerSpray);\n\t\t}\n\t}\n}\n",
      "ParametersText": "SprayCan sprayCan, UnityEngine.Vector3 local0, UnityEngine.Quaternion local5",
      "TargetName": "SprayCan",
      "MethodName": "CreateSpray",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Electronic": [
    {
      "Id": 3549948601,
      "Name": "OnOutputUpdate",
      "FullName": "OnOutputUpdate",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "iOEntity",
          "typeName": "IOEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an output is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void UpdateOutputs()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnOutputUpdate\", this) != null || !ShouldUpdateOutputs() || !ensureOutputsUpdated)\n\t{\n\t\treturn;\n\t}\n\tensureOutputsUpdated = false;\n\tusing (TimeWarning.New(\"ProcessIOOutputs\"))\n\t{\n\t\tfor (int i = 0; i < outputs.Length; i++)\n\t\t{\n\t\t\tIOEntity.IOSlot iOSlot = outputs[i];\n\t\t\tbool flag = true;\n\t\t\tIOEntity iOEntity = iOSlot.connectedTo.Get();\n\t\t\tif (!(iOEntity != null))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (iOSlot.type == IOEntity.IOType.Fluidic && !DisregardGravityRestrictionsOnLiquid && !iOEntity.DisregardGravityRestrictionsOnLiquid)\n\t\t\t{\n\t\t\t\tusing (TimeWarning.New(\"FluidOutputProcessing\"))\n\t\t\t\t{\n\t\t\t\t\tif (!iOEntity.AllowLiquidPassthrough(this, base.transform.TransformPoint(iOSlot.handlePosition)))\n\t\t\t\t\t{\n\t\t\t\t\t\tflag = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tint passthroughAmount = GetPassthroughAmount(i);\n\t\t\tiOEntity.UpdateFromInput(flag ? passthroughAmount : 0, iOSlot.connectedToSlot);\n\t\t}\n\t}\n}\n",
      "ParametersText": "IOEntity iOEntity",
      "TargetName": "IOEntity",
      "MethodName": "UpdateOutputs",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1169047808,
      "Name": "OnInputUpdate",
      "FullName": "OnInputUpdate",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "iOEntity",
          "typeName": "IOEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an input is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void UpdateFromInput(int inputAmount, int inputSlot)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnInputUpdate\", this, inputAmount, inputSlot) != null)\n\t{\n\t\treturn;\n\t}\n\tif (inputs[inputSlot].type != ioType || inputs[inputSlot].type == IOEntity.IOType.Industrial)\n\t{\n\t\tIOStateChanged(inputAmount, inputSlot);\n\t\treturn;\n\t}\n\tUpdateHasPower(inputAmount, inputSlot);\n\tlastEnergy = currentEnergy;\n\tcurrentEnergy = CalculateCurrentEnergy(inputAmount, inputSlot);\n\tint num = GetPassthroughAmount();\n\tif (infiniteIoPower && GetQueueType() == IOEntity.QueueType.ElectricLowPriority)\n\t{\n\t\tnum = 999;\n\t}\n\tbool flag = lastPassthroughEnergy != num;\n\tlastPassthroughEnergy = num;\n\tif (currentEnergy != lastEnergy || flag)\n\t{\n\t\tIOStateChanged(inputAmount, inputSlot);\n\t\tensureOutputsUpdated = true;\n\t}\n\t_processQueues[GetQueueType()].Enqueue(this);\n}\n",
      "ParametersText": "IOEntity iOEntity",
      "TargetName": "IOEntity",
      "MethodName": "UpdateFromInput",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3533854112,
      "Name": "OnCardSwipe",
      "FullName": "OnCardSwipe",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "cardReader",
          "typeName": "CardReader",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Keycard",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when card swipe occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void ServerCardSwiped(BaseEntity.RPCMessage msg)\n{\n\tif (!IsPowered() || UnityEngine.Vector3Ex.Distance2D(msg.player.transform.position, base.transform.position) > 1f || IsInvoking(GrantCard) || IsInvoking(FailCard) || HasFlag(BaseEntity.Flags.On))\n\t{\n\t\treturn;\n\t}\n\tNetworkableId uid = msg.read.EntityID();\n\tKeycard keycard = BaseNetworkable.serverEntities.Find(uid) as Keycard;\n\tEffect.server.Run(swipeEffect.resourcePath, audioPosition.position, UnityEngine.Vector3.up, msg.player.net.connection);\n\tif (keycard == null || Oxide.Core.Interface.CallHook(\"OnCardSwipe\", this, keycard, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tItem item = keycard.GetItem();\n\tif (item != null && !(item.parent.playerOwner != msg.player))\n\t{\n\t\tif (keycard.accessLevel == accessLevel && item.conditionNormalized > 0f)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnKeycardSwiped(msg.player, this);\n\t\t\tInvoke(GrantCard, 0.5f);\n\t\t\titem.LoseCondition(1f);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tInvoke(FailCard, 0.5f);\n\t\t}\n\t}\n}\n",
      "ParametersText": "CardReader cardReader, Keycard local1, BasePlayer player",
      "TargetName": "CardReader",
      "MethodName": "ServerCardSwiped",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 762478235,
      "Name": "OnDigitalClockRing",
      "FullName": "OnDigitalClockRing",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "digitalClock",
          "typeName": "DigitalClock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a digital clock rings."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void Ring()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnDigitalClockRing\", this) == null)\n\t{\n\t\tisRinging = true;\n\t\tClientRPC(RpcTarget.NetworkGroup(\"RPC_StartRinging\"));\n\t\tInvoke(StopRinging, 5f);\n\t\tMarkDirty();\n\t}\n}\n",
      "ParametersText": "DigitalClock digitalClock",
      "TargetName": "DigitalClock",
      "MethodName": "Ring",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1462957189,
      "Name": "OnDigitalClockRingStop",
      "FullName": "OnDigitalClockRingStop",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "digitalClock",
          "typeName": "DigitalClock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a digital clock ring stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void StopRinging()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnDigitalClockRingStop\", this) == null)\n\t{\n\t\tisRinging = false;\n\t\tClientRPC(RpcTarget.NetworkGroup(\"RPC_StopRinging\"));\n\t\tMarkDirty();\n\t}\n}\n",
      "ParametersText": "DigitalClock digitalClock",
      "TargetName": "DigitalClock",
      "MethodName": "StopRinging",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1813865950,
      "Name": "OnDigitalClockAlarmsSet",
      "FullName": "OnDigitalClockAlarmsSet",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "digitalClock",
          "typeName": "DigitalClock",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.DigitalClockMessage",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when digital clock alarms set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.DigitalClockMessage) })]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\npublic void RPC_SetAlarms(BaseEntity.RPCMessage msg)\n{\n\tif (!CanPlayerAdmin(msg.player))\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.DigitalClockMessage digitalClockMessage = msg.read.Proto<ProtoBuf.DigitalClockMessage>();\n\tif (Oxide.Core.Interface.CallHook(\"OnDigitalClockAlarmsSet\", this, digitalClockMessage) != null)\n\t{\n\t\treturn;\n\t}\n\ttry\n\t{\n\t\tif (digitalClockMessage.alarms.Count > 5)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tforeach (ProtoBuf.DigitalClockAlarm alarm in digitalClockMessage.alarms)\n\t\t{\n\t\t\tif (alarm.time < 0f || alarm.time >= 24f)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\talarms.Clear();\n\t\tforeach (ProtoBuf.DigitalClockAlarm alarm2 in digitalClockMessage.alarms)\n\t\t{\n\t\t\tDigitalClock.Alarm item = new DigitalClock.Alarm(DigitalClockEx.ToTimeSpan(alarm2.time), alarm2.active);\n\t\t\talarms.Add(item);\n\t\t}\n\t\tmuted = digitalClockMessage.muted;\n\t\tMarkDirty();\n\t\tSendNetworkUpdate();\n\t}\n\tfinally\n\t{\n\t\t((System.IDisposable)digitalClockMessage)?.Dispose();\n\t}\n}\n",
      "ParametersText": "DigitalClock digitalClock, ProtoBuf.DigitalClockMessage local0",
      "TargetName": "DigitalClock",
      "MethodName": "RPC_SetAlarms",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2616103367,
      "Name": "OnButtonPress",
      "FullName": "OnButtonPress",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "pressButton",
          "typeName": "PressButton",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when button press occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_Press(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnButtonPress\", this, msg.player) == null)\n\t{\n\t\tPress();\n\t}\n}\n",
      "ParametersText": "PressButton pressButton, BasePlayer player",
      "TargetName": "PressButton",
      "MethodName": "RPC_Press",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3039361701,
      "Name": "OnPhoneNameUpdate",
      "FullName": "OnPhoneNameUpdate",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone name is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdatePhoneName(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player != currentPlayer))\n\t{\n\t\tstring text = msg.read.String();\n\t\tif (text.Length > 30)\n\t\t{\n\t\t\ttext = text.Substring(0, 30);\n\t\t}\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhoneNameUpdate\", this, text, msg.player) == null)\n\t\t{\n\t\t\tPhoneName = text;\n\t\t\tbase.baseEntity.SendNetworkUpdate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnPhoneNameUpdated\", this, PhoneName, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, string local0, BasePlayer player",
      "TargetName": "PhoneController",
      "MethodName": "UpdatePhoneName",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 587926495,
      "Name": "OnPhoneNameUpdated",
      "FullName": "OnPhoneNameUpdated",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone name is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdatePhoneName(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player != currentPlayer))\n\t{\n\t\tstring text = msg.read.String();\n\t\tif (text.Length > 30)\n\t\t{\n\t\t\ttext = text.Substring(0, 30);\n\t\t}\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhoneNameUpdate\", this, text, msg.player) == null)\n\t\t{\n\t\t\tPhoneName = text;\n\t\t\tbase.baseEntity.SendNetworkUpdate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnPhoneNameUpdated\", this, PhoneName, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1, BasePlayer player",
      "TargetName": "PhoneController",
      "MethodName": "UpdatePhoneName",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1805755454,
      "Name": "OnSolarPanelSunUpdate",
      "FullName": "OnSolarPanelSunUpdate",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "solarPanel",
          "typeName": "SolarPanel",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a solar panel sun is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SunUpdate()\n{\n\tint num;\n\tif (TOD_Sky.Instance.IsNight)\n\t{\n\t\tnum = 0;\n\t}\n\telse\n\t{\n\t\tUnityEngine.Vector3 sunDirection = TOD_Sky.Instance.SunDirection;\n\t\tfloat value = UnityEngine.Vector3.Dot(sunSampler.forward, sunDirection);\n\t\tfloat num2 = UnityEngine.Mathf.InverseLerp(dot_minimum, dot_maximum, value);\n\t\tif (num2 > 0f && !IsVisible(sunSampler.position + sunDirection * 100f, 101f))\n\t\t{\n\t\t\tnum2 = 0f;\n\t\t}\n\t\tnum = UnityEngine.Mathf.FloorToInt((float)maximalPowerOutput * num2 * base.healthFraction);\n\t}\n\tbool num3 = currentEnergy != num;\n\tcurrentEnergy = num;\n\tif (num3 && Oxide.Core.Interface.CallHook(\"OnSolarPanelSunUpdate\", this, num) == null)\n\t{\n\t\tMarkDirty();\n\t}\n}\n",
      "ParametersText": "SolarPanel solarPanel, int local0",
      "TargetName": "SolarPanel",
      "MethodName": "SunUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1276273354,
      "Name": "OnEntityControl",
      "FullName": "OnEntityControl [AutoTurret]",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity control occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanControl(ulong playerID)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnEntityControl\", this, playerID);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (booting)\n\t{\n\t\treturn false;\n\t}\n\tif (IsPowered())\n\t{\n\t\treturn !PeacekeeperMode();\n\t}\n\treturn false;\n}\n",
      "ParametersText": "AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "CanControl",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1276273354,
      "Name": "OnEntityControl",
      "FullName": "OnEntityControl [PoweredRemoteControl]",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "poweredRemoteControlEntity",
          "typeName": "PoweredRemoteControlEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity control occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanControl(ulong playerID)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnEntityControl\", this, playerID);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!IsPowered())\n\t{\n\t\treturn IsStatic();\n\t}\n\treturn true;\n}\n",
      "ParametersText": "PoweredRemoteControlEntity poweredRemoteControlEntity",
      "TargetName": "PoweredRemoteControlEntity",
      "MethodName": "CanControl",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1276273354,
      "Name": "OnEntityControl",
      "FullName": "OnEntityControl [RemoteControlEntity]",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "remoteControlEntity",
          "typeName": "RemoteControlEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when entity control occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool CanControl(ulong playerID)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnEntityControl\", this, playerID);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "RemoteControlEntity remoteControlEntity",
      "TargetName": "RemoteControlEntity",
      "MethodName": "CanControl",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 92897215,
      "Name": "OnIORefCleared",
      "FullName": "OnIORefCleared",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "iOEntity+IORef",
          "typeName": "IOEntity+IORef",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an IO ref is cleared."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "IOEntity.IORef iOEntity+IORef",
      "TargetName": "IOEntity/IORef",
      "MethodName": "Clear",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3534443171,
      "Name": "OnIORefCleared [patch]",
      "FullName": "OnIORefCleared [patch]",
      "Category": "Electronic",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "IOEntity/IORef",
      "MethodName": "Clear",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1209570562,
      "Name": "OnCCTVDirectionChange",
      "FullName": "OnCCTVDirectionChange",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "cCTV_RC",
          "typeName": "CCTV_RC",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a CCTV direction is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void Server_SetDir(BaseEntity.RPCMessage msg)\n{\n\tif (!IsStatic())\n\t{\n\t\tBasePlayer player = msg.player;\n\t\tif (player.CanBuild() && player.IsBuildingAuthed() && Oxide.Core.Interface.CallHook(\"OnCCTVDirectionChange\", this, player) == null)\n\t\t{\n\t\t\tUnityEngine.Vector3 direction = UnityEngine.Vector3Ex.Direction(player.eyes.position, yaw.transform.position);\n\t\t\tdirection = base.transform.InverseTransformDirection(direction);\n\t\t\tUnityEngine.Vector3 vector = BaseMountable.ConvertVector(UnityEngine.Quaternion.LookRotation(direction).eulerAngles);\n\t\t\tpitchAmount = UnityEngine.Mathf.Clamp(vector.x, pitchClamp.x, pitchClamp.y);\n\t\t\tyawAmount = UnityEngine.Mathf.Clamp(vector.y, yawClamp.x, yawClamp.y);\n\t\t\tSendNetworkUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "CCTV_RC cCTV_RC, BasePlayer local0",
      "TargetName": "CCTV_RC",
      "MethodName": "Server_SetDir",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 134449885,
      "Name": "OnExcavatorSuppliesRequest",
      "FullName": "OnExcavatorSuppliesRequest",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "excavatorSignalComputer",
          "typeName": "ExcavatorSignalComputer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when excavator supplies request occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RequestSupplies(BaseEntity.RPCMessage rpc)\n{\n\tif (HasFlag(BaseEntity.Flags.Reserved7) && IsPowered() && chargePower >= GetChargeNeededForSupplies() && HasSuppliesRemaining() && Oxide.Core.Interface.CallHook(\"OnExcavatorSuppliesRequest\", this, rpc.player) == null)\n\t{\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(supplyPlanePrefab.resourcePath);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tUnityEngine.Vector3 position = dropPoints[UnityEngine.Random.Range(0, dropPoints.Length)].position;\n\t\t\tUnityEngine.Vector3 vector = new UnityEngine.Vector3(UnityEngine.Random.Range(-3f, 3f), 0f, UnityEngine.Random.Range(-3f, 3f));\n\t\t\tbaseEntity.SendMessage(\"InitDropPosition\", position + vector, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\t\tbaseEntity.Spawn();\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnExcavatorSuppliesRequested\", this, rpc.player, baseEntity);\n\t\tchargePower -= GetChargeNeededForSupplies();\n\t\tSetFlag(BaseEntity.Flags.Reserved7, b: false);\n\t\tSetFlag(BaseEntity.Flags.Reserved9, b: true);\n\t\tInvoke(StopTransmitting, 5f);\n\t\tnumSuppliesCalled++;\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "ExcavatorSignalComputer excavatorSignalComputer, BasePlayer player",
      "TargetName": "ExcavatorSignalComputer",
      "MethodName": "RequestSupplies",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 49012084,
      "Name": "OnExcavatorSuppliesRequested",
      "FullName": "OnExcavatorSuppliesRequested",
      "Category": "Electronic",
      "Parameters": [
        {
          "name": "excavatorSignalComputer",
          "typeName": "ExcavatorSignalComputer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an excavator supplies is requested."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RequestSupplies(BaseEntity.RPCMessage rpc)\n{\n\tif (HasFlag(BaseEntity.Flags.Reserved7) && IsPowered() && chargePower >= GetChargeNeededForSupplies() && HasSuppliesRemaining() && Oxide.Core.Interface.CallHook(\"OnExcavatorSuppliesRequest\", this, rpc.player) == null)\n\t{\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(supplyPlanePrefab.resourcePath);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tUnityEngine.Vector3 position = dropPoints[UnityEngine.Random.Range(0, dropPoints.Length)].position;\n\t\t\tUnityEngine.Vector3 vector = new UnityEngine.Vector3(UnityEngine.Random.Range(-3f, 3f), 0f, UnityEngine.Random.Range(-3f, 3f));\n\t\t\tbaseEntity.SendMessage(\"InitDropPosition\", position + vector, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\t\tbaseEntity.Spawn();\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnExcavatorSuppliesRequested\", this, rpc.player, baseEntity);\n\t\tchargePower -= GetChargeNeededForSupplies();\n\t\tSetFlag(BaseEntity.Flags.Reserved7, b: false);\n\t\tSetFlag(BaseEntity.Flags.Reserved9, b: true);\n\t\tInvoke(StopTransmitting, 5f);\n\t\tnumSuppliesCalled++;\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "ExcavatorSignalComputer excavatorSignalComputer, BasePlayer player, BaseEntity local0",
      "TargetName": "ExcavatorSignalComputer",
      "MethodName": "RequestSupplies",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2405514328,
      "Name": "OnCounterTargetChange",
      "FullName": "OnCounterTargetChange",
      "Category": "Electronic",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a counter target is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SERVER_SetTarget(BaseEntity.RPCMessage msg)\n{\n\tint num = msg.read.Int32();\n\tif (Oxide.Core.Interface.CallHook(\"OnCounterTargetChange\", this, msg.player, num) == null && CanPlayerAdmin(msg.player))\n\t{\n\t\ttargetCounterNumber = num;\n\t\tresetTargetNumber = msg.read.Int32();\n\t\ttargetCounterNumber = UnityEngine.Mathf.Clamp(targetCounterNumber, 1, 999);\n\t\tresetTargetNumber = UnityEngine.Mathf.Clamp(resetTargetNumber, 0, 999);\n\t\tMarkDirty();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "PowerCounter",
      "MethodName": "SERVER_SetTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 220135810,
      "Name": "OnCounterTargetChange [patch]",
      "FullName": "OnCounterTargetChange [patch]",
      "Category": "Electronic",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SERVER_SetTarget(BaseEntity.RPCMessage msg)\n{\n\tint num = msg.read.Int32();\n\tif (Oxide.Core.Interface.CallHook(\"OnCounterTargetChange\", this, msg.player, num) == null && CanPlayerAdmin(msg.player))\n\t{\n\t\ttargetCounterNumber = num;\n\t\tresetTargetNumber = msg.read.Int32();\n\t\ttargetCounterNumber = UnityEngine.Mathf.Clamp(targetCounterNumber, 1, 999);\n\t\tresetTargetNumber = UnityEngine.Mathf.Clamp(resetTargetNumber, 0, 999);\n\t\tMarkDirty();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "PowerCounter",
      "MethodName": "SERVER_SetTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1810709207,
      "Name": "OnCounterModeToggle",
      "FullName": "OnCounterModeToggle",
      "Category": "Electronic",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a counter mode toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void ToggleDisplayMode(BaseEntity.RPCMessage msg)\n{\n\tbool flag = msg.read.Bit();\n\tif (Oxide.Core.Interface.CallHook(\"OnCounterModeToggle\", this, msg.player, flag) == null && msg.player.CanBuild())\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved2, flag, recursive: false, networkupdate: false);\n\t\tMarkDirty();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "PowerCounter",
      "MethodName": "ToggleDisplayMode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1989924839,
      "Name": "OnCounterModeToggle [patch]",
      "FullName": "OnCounterModeToggle [patch]",
      "Category": "Electronic",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void ToggleDisplayMode(BaseEntity.RPCMessage msg)\n{\n\tbool flag = msg.read.Bit();\n\tif (Oxide.Core.Interface.CallHook(\"OnCounterModeToggle\", this, msg.player, flag) == null && msg.player.CanBuild())\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved2, flag, recursive: false, networkupdate: false);\n\t\tMarkDirty();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "PowerCounter",
      "MethodName": "ToggleDisplayMode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 615047550,
      "Name": "OnSensorDetect",
      "FullName": "OnSensorDetect",
      "Category": "Electronic",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a sensor is detected."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private int CountDetectedPlayers()\n{\n\tif (myTrigger.entityContents == null || myTrigger.entityContents.Count == 0)\n\t{\n\t\treturn 0;\n\t}\n\tIPrivilege privilege = null;\n\tbool flag = false;\n\tint num = 0;\n\tUnityEngine.Vector3 vector = base.transform.position + base.transform.forward * 0.1f;\n\tif (DebugDraw)\n\t{\n\t\tDebugDrawSensor(vector);\n\t}\n\tforeach (BaseEntity entityContent in myTrigger.entityContents)\n\t{\n\t\tif (!(entityContent is BasePlayer basePlayer) || Oxide.Core.Interface.CallHook(\"OnSensorDetect\", this, basePlayer) != null || basePlayer == null || basePlayer.IsDead() || basePlayer.IsSleeping() || !basePlayer.isServer)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tprivilege = GetPrivilege();\n\t\t\tflag = true;\n\t\t}\n\t\tbool flag2 = privilege?.IsAuthed(basePlayer) ?? false;\n\t\tif ((!flag2 || ShouldIncludeAuthorized()) && (flag2 || ShouldIncludeOthers()))\n\t\t{\n\t\t\tUnityEngine.Vector3 vector2 = basePlayer.ClosestPoint(vector);\n\t\t\tUnityEngine.Vector3 normalized = (vector2 - vector).normalized;\n\t\t\tUnityEngine.Vector3 vector3 = vector2 + normalized * 0.5f;\n\t\t\tbool flag3 = basePlayer.IsVisible(vector, vector2, range);\n\t\t\tbool flag4 = flag3 && basePlayer.CanSee(vector2, vector3);\n\t\t\tbool num2 = flag3 && flag4;\n\t\t\tif (DebugDraw)\n\t\t\t{\n\t\t\t\tDebugDrawPlayer(vector, basePlayer, vector2, vector3, flag3, flag4);\n\t\t\t}\n\t\t\tif (num2)\n\t\t\t{\n\t\t\t\tnum++;\n\t\t\t}\n\t\t}\n\t}\n\treturn num;\n}\n",
      "ParametersText": "",
      "TargetName": "HBHFSensor",
      "MethodName": "CountDetectedPlayers",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Elevator": [
    {
      "Id": 2920425531,
      "Name": "OnLiftUse",
      "FullName": "OnLiftUse",
      "Category": "Elevator",
      "Parameters": [
        {
          "name": "lift",
          "typeName": "Lift",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a lift uses."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void RPC_UseLift(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && Oxide.Core.Interface.CallHook(\"OnLiftUse\", this, rpc.player) == null)\n\t{\n\t\tMoveUp();\n\t}\n}\n",
      "ParametersText": "Lift lift, BasePlayer player",
      "TargetName": "Lift",
      "MethodName": "RPC_UseLift",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2920425531,
      "Name": "OnLiftUse",
      "FullName": "OnLiftUse [ProceduralLift]",
      "Category": "Elevator",
      "Parameters": [
        {
          "name": "proceduralLift",
          "typeName": "ProceduralLift",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a lift uses."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_UseLift(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && Oxide.Core.Interface.CallHook(\"OnLiftUse\", this, rpc.player) == null && !IsBusy())\n\t{\n\t\tMoveToFloor((floorIndex + 1) % stops.Length);\n\t}\n}\n",
      "ParametersText": "ProceduralLift proceduralLift, BasePlayer player",
      "TargetName": "ProceduralLift",
      "MethodName": "RPC_UseLift",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1613147197,
      "Name": "OnElevatorCall",
      "FullName": "OnElevatorCall",
      "Category": "Elevator",
      "Parameters": [
        {
          "name": "elevator",
          "typeName": "Elevator",
          "optional": false
        },
        {
          "name": "elevatorEnt",
          "typeName": "Elevator",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when elevator call occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[System.Runtime.CompilerServices.CompilerGenerated]\nprivate void <CallElevator>b__25_0(Elevator elevatorEnt)\n{\n\tif (elevatorEnt.IsTop && Oxide.Core.Interface.CallHook(\"OnElevatorCall\", this, elevatorEnt) == null)\n\t{\n\t\televatorEnt.RequestMoveLiftTo(Floor, out var _, this);\n\t}\n}\n",
      "ParametersText": "Elevator elevator, Elevator elevatorEnt",
      "TargetName": "Elevator",
      "MethodName": "<CallElevator>b__25_0",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1538801003,
      "Name": "OnElevatorMove",
      "FullName": "OnElevatorMove",
      "Category": "Elevator",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an elevator is moved."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool RequestMoveLiftTo(int targetFloor, out float timeToTravel, Elevator fromElevator)\n{\n\ttimeToTravel = 0f;\n\tif (Oxide.Core.Interface.CallHook(\"OnElevatorMove\", this, targetFloor) != null)\n\t{\n\t\treturn false;\n\t}\n\tif (IsBusy())\n\t{\n\t\treturn false;\n\t}\n\tif (!IsStatic && !IsPowered())\n\t{\n\t\treturn false;\n\t}\n\tif (!IsValidFloor(targetFloor))\n\t{\n\t\treturn false;\n\t}\n\tint num = LiftPositionToFloor();\n\tif (num == targetFloor)\n\t{\n\t\tOpenDoorsAtFloor(num);\n\t\treturn false;\n\t}\n\tif (!liftEntity.IsValid(base.isServer))\n\t{\n\t\treturn false;\n\t}\n\tElevatorLift elevatorLift = liftEntity.Get(base.isServer);\n\tif (!elevatorLift.CanMove())\n\t{\n\t\treturn false;\n\t}\n\tUnityEngine.Vector3 worldSpaceFloorPosition = GetWorldSpaceFloorPosition(targetFloor);\n\tif (!GamePhysics.LineOfSight(elevatorLift.transform.position, worldSpaceFloorPosition, 2097152))\n\t{\n\t\treturn false;\n\t}\n\tOnMoveBegin();\n\ttimeToTravel = TimeToTravelDistance(UnityEngine.Mathf.Abs(elevatorLift.transform.position.y - worldSpaceFloorPosition.y));\n\tLeanTween.moveY(elevatorLift.gameObject, worldSpaceFloorPosition.y, timeToTravel).delay = LiftMoveDelay;\n\ttimeToTravel += LiftMoveDelay;\n\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\tif (targetFloor < Floor)\n\t{\n\t\televatorLift.ToggleHurtTrigger(state: true);\n\t}\n\televatorLift.SetFlag(BaseEntity.Flags.Busy, b: true);\n\tInvoke(ClearBusy, timeToTravel + LiftEndMoveDelay);\n\televatorLift.NotifyNewFloor(targetFloor, Floor);\n\tEntityLinkBroadcast(delegate(Elevator elevatorEnt)\n\t{\n\t\televatorEnt.SetFlag(BaseEntity.Flags.Busy, b: true);\n\t}, (ConstructionSocket socket) => socket.socketType == ConstructionSocket.Type.Elevator);\n\treturn true;\n}\n",
      "ParametersText": "",
      "TargetName": "Elevator",
      "MethodName": "RequestMoveLiftTo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1440475530,
      "Name": "CanElevatorLiftMove",
      "FullName": "CanElevatorLiftMove",
      "Category": "Elevator",
      "Parameters": [
        {
          "name": "elevatorLift",
          "typeName": "ElevatorLift",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to elevator lift move.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanMove()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanElevatorLiftMove\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (VehicleTrigger.HasContents && VehicleTrigger.entityContents != null)\n\t{\n\t\tforeach (BaseEntity entityContent in VehicleTrigger.entityContents)\n\t\t{\n\t\t\tif (!vehiclePrefabWhitelist.Contains(entityContent.prefabID))\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n",
      "ParametersText": "ElevatorLift elevatorLift",
      "TargetName": "ElevatorLift",
      "MethodName": "CanMove",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2293373891,
      "Name": "OnElevatorButtonPress",
      "FullName": "OnElevatorButtonPress",
      "Category": "Elevator",
      "Parameters": [
        {
          "name": "elevatorLift",
          "typeName": "ElevatorLift",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Elevator+Direction",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when elevator button press occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void Server_RaiseLowerFloor(BaseEntity.RPCMessage msg)\n{\n\tElevator.Direction direction = (Elevator.Direction)msg.read.Int32();\n\tbool flag = msg.read.Unread > 0 && msg.read.Bit();\n\tif (Oxide.Core.Interface.CallHook(\"OnElevatorButtonPress\", this, msg.player, direction, flag) == null)\n\t{\n\t\tSetFlag((direction == Elevator.Direction.Up) ? BaseEntity.Flags.Reserved1 : BaseEntity.Flags.Reserved2, b: true);\n\t\tSetFlag(BaseEntity.Flags.Reserved6, flag);\n\t\towner.Server_RaiseLowerElevator(direction, flag);\n\t\tInvoke(ClearDirection, 0.7f);\n\t\tif (liftButtonPressedEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(liftButtonPressedEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ElevatorLift elevatorLift, BasePlayer player, Elevator.Direction local0, bool local1",
      "TargetName": "ElevatorLift",
      "MethodName": "Server_RaiseLowerFloor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Firework": [
    {
      "Id": 31771492,
      "Name": "CanDesignFirework",
      "FullName": "CanDesignFirework",
      "Category": "Firework",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "patternFirework",
          "typeName": "PatternFirework",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to design firework.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool PlayerCanModify(BasePlayer player)\n{\n\tif (player == null || !player.CanInteract())\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanDesignFirework\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tBuildingPrivlidge buildingPrivilege = GetBuildingPrivilege();\n\tif (buildingPrivilege != null && !buildingPrivilege.CanAdministrate(player))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, PatternFirework patternFirework",
      "TargetName": "PatternFirework",
      "MethodName": "PlayerCanModify",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 814018261,
      "Name": "OnFireworkDesignChange",
      "FullName": "OnFireworkDesignChange",
      "Category": "Firework",
      "Parameters": [
        {
          "name": "patternFirework",
          "typeName": "PatternFirework",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.PatternFirework+Design",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a firework design is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.PatternFirework.Design) })]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void ServerSetFireworkDesign(BaseEntity.RPCMessage rpc)\n{\n\tif (!PlayerCanModify(rpc.player))\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.PatternFirework.Design design = rpc.read.Proto<ProtoBuf.PatternFirework.Design>();\n\tif (Oxide.Core.Interface.CallHook(\"OnFireworkDesignChange\", this, design, rpc.player) != null)\n\t{\n\t\treturn;\n\t}\n\tif (design?.stars != null)\n\t{\n\t\twhile (design.stars.Count > MaxStars)\n\t\t{\n\t\t\tint index = design.stars.Count - 1;\n\t\t\tdesign.stars[index].Dispose();\n\t\t\tdesign.stars.RemoveAt(index);\n\t\t}\n\t\tforeach (ProtoBuf.PatternFirework.Star star in design.stars)\n\t\t{\n\t\t\tstar.position = new UnityEngine.Vector2(UnityEngine.Mathf.Clamp(star.position.x, -1f, 1f), UnityEngine.Mathf.Clamp(star.position.y, -1f, 1f));\n\t\t\tstar.color = new UnityEngine.Color(UnityEngine.Mathf.Clamp01(star.color.r), UnityEngine.Mathf.Clamp01(star.color.g), UnityEngine.Mathf.Clamp01(star.color.b), 1f);\n\t\t}\n\t\tdesign.editedBy = rpc.player.userID;\n\t}\n\tDesign?.Dispose();\n\tDesign = design;\n\tOxide.Core.Interface.CallHook(\"OnFireworkDesignChanged\", this, design, rpc.player);\n\tSendNetworkUpdateImmediate();\n}\n",
      "ParametersText": "PatternFirework patternFirework, ProtoBuf.PatternFirework.Design local0, BasePlayer player",
      "TargetName": "PatternFirework",
      "MethodName": "ServerSetFireworkDesign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2779499551,
      "Name": "OnFireworkDesignChanged",
      "FullName": "OnFireworkDesignChanged",
      "Category": "Firework",
      "Parameters": [
        {
          "name": "patternFirework",
          "typeName": "PatternFirework",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.PatternFirework+Design",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a firework design is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(ProtoBuf.PatternFirework.Design) })]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void ServerSetFireworkDesign(BaseEntity.RPCMessage rpc)\n{\n\tif (!PlayerCanModify(rpc.player))\n\t{\n\t\treturn;\n\t}\n\tProtoBuf.PatternFirework.Design design = rpc.read.Proto<ProtoBuf.PatternFirework.Design>();\n\tif (Oxide.Core.Interface.CallHook(\"OnFireworkDesignChange\", this, design, rpc.player) != null)\n\t{\n\t\treturn;\n\t}\n\tif (design?.stars != null)\n\t{\n\t\twhile (design.stars.Count > MaxStars)\n\t\t{\n\t\t\tint index = design.stars.Count - 1;\n\t\t\tdesign.stars[index].Dispose();\n\t\t\tdesign.stars.RemoveAt(index);\n\t\t}\n\t\tforeach (ProtoBuf.PatternFirework.Star star in design.stars)\n\t\t{\n\t\t\tstar.position = new UnityEngine.Vector2(UnityEngine.Mathf.Clamp(star.position.x, -1f, 1f), UnityEngine.Mathf.Clamp(star.position.y, -1f, 1f));\n\t\t\tstar.color = new UnityEngine.Color(UnityEngine.Mathf.Clamp01(star.color.r), UnityEngine.Mathf.Clamp01(star.color.g), UnityEngine.Mathf.Clamp01(star.color.b), 1f);\n\t\t}\n\t\tdesign.editedBy = rpc.player.userID;\n\t}\n\tDesign?.Dispose();\n\tDesign = design;\n\tOxide.Core.Interface.CallHook(\"OnFireworkDesignChanged\", this, design, rpc.player);\n\tSendNetworkUpdateImmediate();\n}\n",
      "ParametersText": "PatternFirework patternFirework, ProtoBuf.PatternFirework.Design local0, BasePlayer player",
      "TargetName": "PatternFirework",
      "MethodName": "ServerSetFireworkDesign",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1475245939,
      "Name": "OnFireworkStarted",
      "FullName": "OnFireworkStarted",
      "Category": "Firework",
      "Parameters": [
        {
          "name": "baseFirework",
          "typeName": "BaseFirework",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a firework starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Begin()\n{\n\tSetFlag(BaseEntity.Flags.OnFire, b: false);\n\tSetFlag(BaseEntity.Flags.On, b: true, recursive: false, networkupdate: false);\n\tSendNetworkUpdate_Flags();\n\tOxide.Core.Interface.CallHook(\"OnFireworkStarted\", this);\n\tInvoke(OnExhausted, activityLength);\n}\n",
      "ParametersText": "BaseFirework baseFirework",
      "TargetName": "BaseFirework",
      "MethodName": "Begin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3435805585,
      "Name": "OnFireworkExhausted",
      "FullName": "OnFireworkExhausted",
      "Category": "Firework",
      "Parameters": [
        {
          "name": "baseFirework",
          "typeName": "BaseFirework",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a firework is exhausted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnExhausted()\n{\n\tSetFlag(BaseEntity.Flags.Reserved8, b: true, recursive: false, networkupdate: false);\n\tSetFlag(BaseEntity.Flags.OnFire, b: false, recursive: false, networkupdate: false);\n\tSetFlag(BaseEntity.Flags.On, b: false, recursive: false, networkupdate: false);\n\tEnableGlobalBroadcast(wants: false);\n\tSendNetworkUpdate_Flags();\n\tOxide.Core.Interface.CallHook(\"OnFireworkExhausted\", this);\n\tInvoke(Cleanup, corpseDuration);\n\t_activeFireworks.Remove(this);\n}\n",
      "ParametersText": "BaseFirework baseFirework",
      "TargetName": "BaseFirework",
      "MethodName": "OnExhausted",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2487799829,
      "Name": "OnFireworkDamage",
      "FullName": "OnFireworkDamage",
      "Category": "Firework",
      "Parameters": [
        {
          "name": "baseFirework",
          "typeName": "BaseFirework",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a firework is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnAttacked(HitInfo info)\n{\n\tbase.OnAttacked(info);\n\tif (base.isServer && Oxide.Core.Interface.CallHook(\"OnFireworkDamage\", this, info) == null && info.damageTypes.Has(Rust.DamageType.Heat))\n\t{\n\t\tStaggeredTryLightFuse();\n\t}\n}\n",
      "ParametersText": "BaseFirework baseFirework",
      "TargetName": "BaseFirework",
      "MethodName": "OnAttacked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Fishing": [
    {
      "Id": 197690385,
      "Name": "OnFishingStopped",
      "FullName": "OnFishingStopped",
      "Category": "Fishing",
      "Parameters": [
        {
          "name": "baseFishingRod",
          "typeName": "BaseFishingRod",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "BaseFishingRod+FailReason",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a fishing stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void Server_Cancel(BaseEntity.RPCMessage msg)\n{\n\tif (CurrentState != BaseFishingRod.CatchState.Caught)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.UserRequested);\n\t}\n}\n",
      "ParametersText": "BaseFishingRod baseFishingRod, BaseFishingRod.FailReason reason",
      "TargetName": "BaseFishingRod",
      "MethodName": "Server_Cancel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 264708708,
      "Name": "OnFishingRodCast",
      "FullName": "OnFishingRodCast",
      "Category": "Fishing",
      "Parameters": [
        {
          "name": "baseFishingRod",
          "typeName": "BaseFishingRod",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fishing rod cast occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(UnityEngine.Vector3) })]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void Server_RequestCast(BaseEntity.RPCMessage msg)\n{\n\tUnityEngine.Vector3 pos = msg.read.Vector3();\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tItem currentLure = GetCurrentLure();\n\tif (currentLure == null)\n\t{\n\t\tFailedCast(BaseFishingRod.FailReason.NoLure);\n\t\treturn;\n\t}\n\tif (!EvaluateFishingPosition(ref pos, ownerPlayer, out var reason, out surfaceBody))\n\t{\n\t\tFailedCast(reason);\n\t\treturn;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanCastFishingRod\", ownerPlayer, this, currentLure, pos);\n\tif (!(obj is bool) || (bool)obj)\n\t{\n\t\tFishingBobber component = base.gameManager.CreateEntity(FishingBobberRef.resourcePath, base.transform.position + UnityEngine.Vector3.up * 2.8f + ownerPlayer.eyes.BodyForward() * 1.8f, GetOwnerPlayer().ServerRotation).GetComponent<FishingBobber>();\n\t\tcomponent.transform.forward = GetOwnerPlayer().eyes.BodyForward();\n\t\tcomponent.Spawn();\n\t\tcomponent.InitialiseBobber(ownerPlayer, surfaceBody, pos, 150f);\n\t\tint usedLureAmount = 0;\n\t\tbool isOverfished = false;\n\t\tif (FishLookup.Instance != null)\n\t\t{\n\t\t\tcurrentFishTarget = FishLookup.Instance.GetFish(component.transform.position, surfaceBody, currentLure, out fishableModifier, lastFish, out usedLureAmount, out isOverfished);\n\t\t}\n\t\tif (isOverfished)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Red_Normal, overfishedWarningPhrase, false);\n\t\t}\n\t\tlureUsed = currentLure.info;\n\t\tcurrentLure.UseItem(usedLureAmount);\n\t\tlastFish = fishableModifier;\n\t\tcurrentBobber.Set(component);\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_ReceiveCastPoint\"), component.net.ID);\n\t\townerPlayer.SignalBroadcast(BaseEntity.Signal.Attack);\n\t\tcatchTime = (ImmediateHook ? 0f : UnityEngine.Random.Range(10f, 20f));\n\t\tcatchTime = (float)catchTime * fishableModifier.CatchWaitTimeMultiplier;\n\t\tfloat val = (lureUsed.TryGetComponent<ItemModCompostable>(out var component2) ? component2.BaitValue : 0f);\n\t\tval = Mathx.RemapValClamped(val, 0f, 20f, 1f, 10f);\n\t\tcatchTime = UnityEngine.Mathf.Clamp((float)catchTime - val, 3f, 20f);\n\t\tplayerStartPosition = ownerPlayer.transform.position;\n\t\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\t\tCurrentState = BaseFishingRod.CatchState.Waiting;\n\t\tInvokeRepeating(CatchProcess, 0f, 0f);\n\t\tinQueue = false;\n\t\tBasePlayer ownerPlayer2 = GetOwnerPlayer();\n\t\tif (ownerPlayer2 != null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnStartFish(ownerPlayer2, currentLure, pos);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnFishingRodCast\", this, ownerPlayer, currentLure);\n\t}\n}\n",
      "ParametersText": "BaseFishingRod baseFishingRod, BasePlayer local1, Item local2",
      "TargetName": "BaseFishingRod",
      "MethodName": "Server_RequestCast",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2806373814,
      "Name": "OnFishCaught",
      "FullName": "OnFishCaught",
      "Category": "Fishing",
      "Parameters": [
        {
          "name": "baseFishingRod",
          "typeName": "BaseFishingRod",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BaseFishingRod",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fish caught occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void CatchProcessBudgeted()\n{\n\tinQueue = false;\n\tFishingBobber fishingBobber = currentBobber.Get(serverside: true);\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (ownerPlayer == null || ownerPlayer.IsSleeping() || ownerPlayer.IsWounded() || ownerPlayer.IsDead() || fishingBobber == null)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.UserRequested);\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 position = ownerPlayer.transform.position;\n\tfloat num = UnityEngine.Vector3.Angle((UnityEngine.Vector3Ex.WithY(fishingBobber.transform.position, 0f) - UnityEngine.Vector3Ex.WithY(position, 0f)).normalized, UnityEngine.Vector3Ex.WithY(ownerPlayer.eyes.HeadForward(), 0f));\n\tfloat num2 = UnityEngine.Vector3.Distance(position, UnityEngine.Vector3Ex.WithY(fishingBobber.transform.position, position.y));\n\tif (num > ((num2 > 1.2f) ? 60f : 180f))\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.BadAngle);\n\t\treturn;\n\t}\n\tif (num2 > 1.2f && (float)lastSightCheck > 0.4f)\n\t{\n\t\tif (!GamePhysics.LineOfSight(ownerPlayer.eyes.position, fishingBobber.transform.position, 1084293377))\n\t\t{\n\t\t\tServer_Cancel(BaseFishingRod.FailReason.Obstructed);\n\t\t\treturn;\n\t\t}\n\t\tlastSightCheck = 0f;\n\t}\n\tif (UnityEngine.Vector3.Distance(position, fishingBobber.transform.position) > MaxCastDistance * 2f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TooFarAway);\n\t\treturn;\n\t}\n\tif (UnityEngine.Vector3.Distance(playerStartPosition, position) > 1f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.PlayerMoved);\n\t\treturn;\n\t}\n\tif (CurrentState == BaseFishingRod.CatchState.Waiting)\n\t{\n\t\tif ((float)catchTime < 0f)\n\t\t{\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_HookedSomething\"));\n\t\t\tCurrentState = BaseFishingRod.CatchState.Catching;\n\t\t\tfishingBobber.SetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\t\tnextFishStateChange = 0f;\n\t\t\tfishCatchDuration = 0f;\n\t\t\tstrainTimer = 0f;\n\t\t}\n\t\treturn;\n\t}\n\tBaseFishingRod.FishState fishState = currentFishState;\n\tif ((float)nextFishStateChange < 0f)\n\t{\n\t\tfloat num3 = Mathx.RemapValClamped(fishingBobber.TireAmount, 0f, 20f, 0f, 1f);\n\t\tif (currentFishState != 0)\n\t\t{\n\t\t\tcurrentFishState = (BaseFishingRod.FishState)0;\n\t\t\tnextFishStateChange = UnityEngine.Random.Range(2f, 4f) * (num3 + 1f);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnextFishStateChange = UnityEngine.Random.Range(3f, 7f) * (1f - num3);\n\t\t\tif (UnityEngine.Random.Range(0, 100) < 50)\n\t\t\t{\n\t\t\t\tcurrentFishState = BaseFishingRod.FishState.PullingLeft;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrentFishState = BaseFishingRod.FishState.PullingRight;\n\t\t\t}\n\t\t\tif (UnityEngine.Random.Range(0, 100) > 60 && UnityEngine.Vector3.Distance(fishingBobber.transform.position, ownerPlayer.transform.position) < MaxCastDistance - 2f)\n\t\t\t{\n\t\t\t\tcurrentFishState |= BaseFishingRod.FishState.PullingBack;\n\t\t\t}\n\t\t}\n\t}\n\tif ((float)fishCatchDuration > 120f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TimeOut);\n\t\treturn;\n\t}\n\tbool flag = ownerPlayer.serverInput.IsDown(BUTTON.RIGHT);\n\tbool flag2 = ownerPlayer.serverInput.IsDown(BUTTON.LEFT);\n\tbool flag3 = HasReelInInput(ownerPlayer.serverInput);\n\tif (flag2 && flag)\n\t{\n\t\tflag2 = (flag = false);\n\t}\n\tUpdateFlags(flag2, flag, flag3);\n\tif (CurrentState == BaseFishingRod.CatchState.Waiting)\n\t{\n\t\tflag = (flag2 = (flag3 = false));\n\t}\n\tif (flag2 && !AllowPullInDirection(-ownerPlayer.eyes.HeadRight(), fishingBobber.transform.position))\n\t{\n\t\tflag2 = false;\n\t}\n\tif (flag && !AllowPullInDirection(ownerPlayer.eyes.HeadRight(), fishingBobber.transform.position))\n\t{\n\t\tflag = false;\n\t}\n\tfloat value = ownerPlayer.modifiers.GetValue(Modifier.ModifierType.FishingBoost, 1f);\n\tfishingBobber.ServerMovementUpdate(flag2, flag, flag3, ref currentFishState, position, fishableModifier, value);\n\tbool flag4 = false;\n\tfloat num4 = 0f;\n\tif (flag3 || flag2 || flag)\n\t{\n\t\tflag4 = true;\n\t\tnum4 = 0.5f;\n\t}\n\tif (currentFishState != 0 && flag4)\n\t{\n\t\tif (currentFishState.Contains(BaseFishingRod.FishState.PullingBack) && flag3)\n\t\t{\n\t\t\tnum4 = 1.5f;\n\t\t}\n\t\telse if ((currentFishState.Contains(BaseFishingRod.FishState.PullingLeft) || currentFishState.Contains(BaseFishingRod.FishState.PullingRight)) && flag3)\n\t\t{\n\t\t\tnum4 = 1.2f;\n\t\t}\n\t\telse if (currentFishState.Contains(BaseFishingRod.FishState.PullingLeft) && flag)\n\t\t{\n\t\t\tnum4 = 0.8f;\n\t\t}\n\t\telse if (currentFishState.Contains(BaseFishingRod.FishState.PullingRight) && flag2)\n\t\t{\n\t\t\tnum4 = 0.8f;\n\t\t}\n\t}\n\tif (flag3 && currentFishState != 0)\n\t{\n\t\tnum4 += 1f;\n\t}\n\tnum4 *= fishableModifier.StrainModifier * GlobalStrainSpeedMultiplier;\n\tnum4 -= ownerPlayer.modifiers.GetValue(Modifier.ModifierType.FishingBoost, 1f) - 1f;\n\tif (flag4)\n\t{\n\t\tstrainTimer += UnityEngine.Time.deltaTime * num4;\n\t}\n\telse\n\t{\n\t\tstrainTimer = UnityEngine.Mathf.MoveTowards(strainTimer, 0f, UnityEngine.Time.deltaTime * 1.5f);\n\t}\n\tfloat num5 = strainTimer / 6f;\n\tSetFlag(BaseEntity.Flags.Reserved1, flag4 && num5 > 0.25f);\n\tif ((float)lastStrainUpdate > 0.4f || fishState != currentFishState)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_UpdateFishState\"), (int)currentFishState, num5);\n\t\tlastStrainUpdate = 0f;\n\t}\n\tif (strainTimer > 7f || ForceFail)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TensionBreak);\n\t}\n\telse\n\t{\n\t\tif (!(num2 <= FishCatchDistance) && !ForceSuccess)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tCurrentState = BaseFishingRod.CatchState.Caught;\n\t\tif (currentFishTarget != null)\n\t\t{\n\t\t\tItem item = ItemManager.Create(currentFishTarget, 1, 0uL);\n\t\t\titem.SetItemOwnership(ownerPlayer, ItemOwnershipPhrases.Fishing);\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"CanCatchFish\", ownerPlayer, this, item);\n\t\t\tif (obj is bool && !(bool)obj)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"OnFishCatch\", item, this, ownerPlayer);\n\t\t\tif (obj2 is Item && obj2 as Item != item)\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t\titem = (Item)obj2;\n\t\t\t}\n\t\t\townerPlayer.GiveItem(item, BaseEntity.GiveItemReason.Crafted);\n\t\t\tif (currentFishTarget.shortname == \"skull.human\")\n\t\t\t{\n\t\t\t\titem.name = Facepunch.RandomUsernames.Get(UnityEngine.Random.Range(0, 1000));\n\t\t\t}\n\t\t\tif (Rust.GameInfo.HasAchievements && !string.IsNullOrEmpty(fishableModifier.SteamStatName))\n\t\t\t{\n\t\t\t\townerPlayer.stats.Add(fishableModifier.SteamStatName, 1);\n\t\t\t\townerPlayer.stats.Save(forceSteamSave: true);\n\t\t\t\tFishLookup.Instance.CheckCatchAllAchievement(ownerPlayer);\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnCaughtFish(ownerPlayer, item);\n\t\t\tif (!ConVar.Fishing.disableOverfishing && currentFishTarget.TryGetComponent<ItemModFishable>(out var component) && !component.IsJunk)\n\t\t\t{\n\t\t\t\tFishArea(fishingBobber.transform.position);\n\t\t\t}\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_OnCaughtFish\"), currentFishTarget.itemid);\n\t\t}\n\t\townerPlayer.SignalBroadcast(BaseEntity.Signal.Alt_Attack);\n\t\tInvoke(ResetLine, 6f);\n\t\tfishingBobber.Kill();\n\t\tcurrentBobber.Set(null);\n\t\tCancelInvoke(CatchProcess);\n\t\tOxide.Core.Interface.CallHook(\"OnFishCaught\", currentFishTarget, this, ownerPlayer);\n\t}\n}\n",
      "ParametersText": "BaseFishingRod baseFishingRod, BaseFishingRod self1, BasePlayer local1",
      "TargetName": "BaseFishingRod",
      "MethodName": "CatchProcessBudgeted",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3271740817,
      "Name": "CanCastFishingRod",
      "FullName": "CanCastFishingRod",
      "Category": "Fishing",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to cast fishing rod.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.InputValidation(new System.Type[] { typeof(UnityEngine.Vector3) })]\n[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void Server_RequestCast(BaseEntity.RPCMessage msg)\n{\n\tUnityEngine.Vector3 pos = msg.read.Vector3();\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tItem currentLure = GetCurrentLure();\n\tif (currentLure == null)\n\t{\n\t\tFailedCast(BaseFishingRod.FailReason.NoLure);\n\t\treturn;\n\t}\n\tif (!EvaluateFishingPosition(ref pos, ownerPlayer, out var reason, out surfaceBody))\n\t{\n\t\tFailedCast(reason);\n\t\treturn;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanCastFishingRod\", ownerPlayer, this, currentLure, pos);\n\tif (!(obj is bool) || (bool)obj)\n\t{\n\t\tFishingBobber component = base.gameManager.CreateEntity(FishingBobberRef.resourcePath, base.transform.position + UnityEngine.Vector3.up * 2.8f + ownerPlayer.eyes.BodyForward() * 1.8f, GetOwnerPlayer().ServerRotation).GetComponent<FishingBobber>();\n\t\tcomponent.transform.forward = GetOwnerPlayer().eyes.BodyForward();\n\t\tcomponent.Spawn();\n\t\tcomponent.InitialiseBobber(ownerPlayer, surfaceBody, pos, 150f);\n\t\tint usedLureAmount = 0;\n\t\tbool isOverfished = false;\n\t\tif (FishLookup.Instance != null)\n\t\t{\n\t\t\tcurrentFishTarget = FishLookup.Instance.GetFish(component.transform.position, surfaceBody, currentLure, out fishableModifier, lastFish, out usedLureAmount, out isOverfished);\n\t\t}\n\t\tif (isOverfished)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Red_Normal, overfishedWarningPhrase, false);\n\t\t}\n\t\tlureUsed = currentLure.info;\n\t\tcurrentLure.UseItem(usedLureAmount);\n\t\tlastFish = fishableModifier;\n\t\tcurrentBobber.Set(component);\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_ReceiveCastPoint\"), component.net.ID);\n\t\townerPlayer.SignalBroadcast(BaseEntity.Signal.Attack);\n\t\tcatchTime = (ImmediateHook ? 0f : UnityEngine.Random.Range(10f, 20f));\n\t\tcatchTime = (float)catchTime * fishableModifier.CatchWaitTimeMultiplier;\n\t\tfloat val = (lureUsed.TryGetComponent<ItemModCompostable>(out var component2) ? component2.BaitValue : 0f);\n\t\tval = Mathx.RemapValClamped(val, 0f, 20f, 1f, 10f);\n\t\tcatchTime = UnityEngine.Mathf.Clamp((float)catchTime - val, 3f, 20f);\n\t\tplayerStartPosition = ownerPlayer.transform.position;\n\t\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\t\tCurrentState = BaseFishingRod.CatchState.Waiting;\n\t\tInvokeRepeating(CatchProcess, 0f, 0f);\n\t\tinQueue = false;\n\t\tBasePlayer ownerPlayer2 = GetOwnerPlayer();\n\t\tif (ownerPlayer2 != null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnStartFish(ownerPlayer2, currentLure, pos);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnFishingRodCast\", this, ownerPlayer, currentLure);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "BaseFishingRod",
      "MethodName": "Server_RequestCast",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3990265919,
      "Name": "CanCatchFish",
      "FullName": "CanCatchFish",
      "Category": "Fishing",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to catch fish.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void CatchProcessBudgeted()\n{\n\tinQueue = false;\n\tFishingBobber fishingBobber = currentBobber.Get(serverside: true);\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (ownerPlayer == null || ownerPlayer.IsSleeping() || ownerPlayer.IsWounded() || ownerPlayer.IsDead() || fishingBobber == null)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.UserRequested);\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 position = ownerPlayer.transform.position;\n\tfloat num = UnityEngine.Vector3.Angle((UnityEngine.Vector3Ex.WithY(fishingBobber.transform.position, 0f) - UnityEngine.Vector3Ex.WithY(position, 0f)).normalized, UnityEngine.Vector3Ex.WithY(ownerPlayer.eyes.HeadForward(), 0f));\n\tfloat num2 = UnityEngine.Vector3.Distance(position, UnityEngine.Vector3Ex.WithY(fishingBobber.transform.position, position.y));\n\tif (num > ((num2 > 1.2f) ? 60f : 180f))\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.BadAngle);\n\t\treturn;\n\t}\n\tif (num2 > 1.2f && (float)lastSightCheck > 0.4f)\n\t{\n\t\tif (!GamePhysics.LineOfSight(ownerPlayer.eyes.position, fishingBobber.transform.position, 1084293377))\n\t\t{\n\t\t\tServer_Cancel(BaseFishingRod.FailReason.Obstructed);\n\t\t\treturn;\n\t\t}\n\t\tlastSightCheck = 0f;\n\t}\n\tif (UnityEngine.Vector3.Distance(position, fishingBobber.transform.position) > MaxCastDistance * 2f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TooFarAway);\n\t\treturn;\n\t}\n\tif (UnityEngine.Vector3.Distance(playerStartPosition, position) > 1f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.PlayerMoved);\n\t\treturn;\n\t}\n\tif (CurrentState == BaseFishingRod.CatchState.Waiting)\n\t{\n\t\tif ((float)catchTime < 0f)\n\t\t{\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_HookedSomething\"));\n\t\t\tCurrentState = BaseFishingRod.CatchState.Catching;\n\t\t\tfishingBobber.SetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\t\tnextFishStateChange = 0f;\n\t\t\tfishCatchDuration = 0f;\n\t\t\tstrainTimer = 0f;\n\t\t}\n\t\treturn;\n\t}\n\tBaseFishingRod.FishState fishState = currentFishState;\n\tif ((float)nextFishStateChange < 0f)\n\t{\n\t\tfloat num3 = Mathx.RemapValClamped(fishingBobber.TireAmount, 0f, 20f, 0f, 1f);\n\t\tif (currentFishState != 0)\n\t\t{\n\t\t\tcurrentFishState = (BaseFishingRod.FishState)0;\n\t\t\tnextFishStateChange = UnityEngine.Random.Range(2f, 4f) * (num3 + 1f);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnextFishStateChange = UnityEngine.Random.Range(3f, 7f) * (1f - num3);\n\t\t\tif (UnityEngine.Random.Range(0, 100) < 50)\n\t\t\t{\n\t\t\t\tcurrentFishState = BaseFishingRod.FishState.PullingLeft;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrentFishState = BaseFishingRod.FishState.PullingRight;\n\t\t\t}\n\t\t\tif (UnityEngine.Random.Range(0, 100) > 60 && UnityEngine.Vector3.Distance(fishingBobber.transform.position, ownerPlayer.transform.position) < MaxCastDistance - 2f)\n\t\t\t{\n\t\t\t\tcurrentFishState |= BaseFishingRod.FishState.PullingBack;\n\t\t\t}\n\t\t}\n\t}\n\tif ((float)fishCatchDuration > 120f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TimeOut);\n\t\treturn;\n\t}\n\tbool flag = ownerPlayer.serverInput.IsDown(BUTTON.RIGHT);\n\tbool flag2 = ownerPlayer.serverInput.IsDown(BUTTON.LEFT);\n\tbool flag3 = HasReelInInput(ownerPlayer.serverInput);\n\tif (flag2 && flag)\n\t{\n\t\tflag2 = (flag = false);\n\t}\n\tUpdateFlags(flag2, flag, flag3);\n\tif (CurrentState == BaseFishingRod.CatchState.Waiting)\n\t{\n\t\tflag = (flag2 = (flag3 = false));\n\t}\n\tif (flag2 && !AllowPullInDirection(-ownerPlayer.eyes.HeadRight(), fishingBobber.transform.position))\n\t{\n\t\tflag2 = false;\n\t}\n\tif (flag && !AllowPullInDirection(ownerPlayer.eyes.HeadRight(), fishingBobber.transform.position))\n\t{\n\t\tflag = false;\n\t}\n\tfloat value = ownerPlayer.modifiers.GetValue(Modifier.ModifierType.FishingBoost, 1f);\n\tfishingBobber.ServerMovementUpdate(flag2, flag, flag3, ref currentFishState, position, fishableModifier, value);\n\tbool flag4 = false;\n\tfloat num4 = 0f;\n\tif (flag3 || flag2 || flag)\n\t{\n\t\tflag4 = true;\n\t\tnum4 = 0.5f;\n\t}\n\tif (currentFishState != 0 && flag4)\n\t{\n\t\tif (currentFishState.Contains(BaseFishingRod.FishState.PullingBack) && flag3)\n\t\t{\n\t\t\tnum4 = 1.5f;\n\t\t}\n\t\telse if ((currentFishState.Contains(BaseFishingRod.FishState.PullingLeft) || currentFishState.Contains(BaseFishingRod.FishState.PullingRight)) && flag3)\n\t\t{\n\t\t\tnum4 = 1.2f;\n\t\t}\n\t\telse if (currentFishState.Contains(BaseFishingRod.FishState.PullingLeft) && flag)\n\t\t{\n\t\t\tnum4 = 0.8f;\n\t\t}\n\t\telse if (currentFishState.Contains(BaseFishingRod.FishState.PullingRight) && flag2)\n\t\t{\n\t\t\tnum4 = 0.8f;\n\t\t}\n\t}\n\tif (flag3 && currentFishState != 0)\n\t{\n\t\tnum4 += 1f;\n\t}\n\tnum4 *= fishableModifier.StrainModifier * GlobalStrainSpeedMultiplier;\n\tnum4 -= ownerPlayer.modifiers.GetValue(Modifier.ModifierType.FishingBoost, 1f) - 1f;\n\tif (flag4)\n\t{\n\t\tstrainTimer += UnityEngine.Time.deltaTime * num4;\n\t}\n\telse\n\t{\n\t\tstrainTimer = UnityEngine.Mathf.MoveTowards(strainTimer, 0f, UnityEngine.Time.deltaTime * 1.5f);\n\t}\n\tfloat num5 = strainTimer / 6f;\n\tSetFlag(BaseEntity.Flags.Reserved1, flag4 && num5 > 0.25f);\n\tif ((float)lastStrainUpdate > 0.4f || fishState != currentFishState)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_UpdateFishState\"), (int)currentFishState, num5);\n\t\tlastStrainUpdate = 0f;\n\t}\n\tif (strainTimer > 7f || ForceFail)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TensionBreak);\n\t}\n\telse\n\t{\n\t\tif (!(num2 <= FishCatchDistance) && !ForceSuccess)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tCurrentState = BaseFishingRod.CatchState.Caught;\n\t\tif (currentFishTarget != null)\n\t\t{\n\t\t\tItem item = ItemManager.Create(currentFishTarget, 1, 0uL);\n\t\t\titem.SetItemOwnership(ownerPlayer, ItemOwnershipPhrases.Fishing);\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"CanCatchFish\", ownerPlayer, this, item);\n\t\t\tif (obj is bool && !(bool)obj)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"OnFishCatch\", item, this, ownerPlayer);\n\t\t\tif (obj2 is Item && obj2 as Item != item)\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t\titem = (Item)obj2;\n\t\t\t}\n\t\t\townerPlayer.GiveItem(item, BaseEntity.GiveItemReason.Crafted);\n\t\t\tif (currentFishTarget.shortname == \"skull.human\")\n\t\t\t{\n\t\t\t\titem.name = Facepunch.RandomUsernames.Get(UnityEngine.Random.Range(0, 1000));\n\t\t\t}\n\t\t\tif (Rust.GameInfo.HasAchievements && !string.IsNullOrEmpty(fishableModifier.SteamStatName))\n\t\t\t{\n\t\t\t\townerPlayer.stats.Add(fishableModifier.SteamStatName, 1);\n\t\t\t\townerPlayer.stats.Save(forceSteamSave: true);\n\t\t\t\tFishLookup.Instance.CheckCatchAllAchievement(ownerPlayer);\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnCaughtFish(ownerPlayer, item);\n\t\t\tif (!ConVar.Fishing.disableOverfishing && currentFishTarget.TryGetComponent<ItemModFishable>(out var component) && !component.IsJunk)\n\t\t\t{\n\t\t\t\tFishArea(fishingBobber.transform.position);\n\t\t\t}\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_OnCaughtFish\"), currentFishTarget.itemid);\n\t\t}\n\t\townerPlayer.SignalBroadcast(BaseEntity.Signal.Alt_Attack);\n\t\tInvoke(ResetLine, 6f);\n\t\tfishingBobber.Kill();\n\t\tcurrentBobber.Set(null);\n\t\tCancelInvoke(CatchProcess);\n\t\tOxide.Core.Interface.CallHook(\"OnFishCaught\", currentFishTarget, this, ownerPlayer);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "BaseFishingRod",
      "MethodName": "CatchProcessBudgeted",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1173046409,
      "Name": "OnFishCatch",
      "FullName": "OnFishCatch",
      "Category": "Fishing",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when fish catch occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void CatchProcessBudgeted()\n{\n\tinQueue = false;\n\tFishingBobber fishingBobber = currentBobber.Get(serverside: true);\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (ownerPlayer == null || ownerPlayer.IsSleeping() || ownerPlayer.IsWounded() || ownerPlayer.IsDead() || fishingBobber == null)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.UserRequested);\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 position = ownerPlayer.transform.position;\n\tfloat num = UnityEngine.Vector3.Angle((UnityEngine.Vector3Ex.WithY(fishingBobber.transform.position, 0f) - UnityEngine.Vector3Ex.WithY(position, 0f)).normalized, UnityEngine.Vector3Ex.WithY(ownerPlayer.eyes.HeadForward(), 0f));\n\tfloat num2 = UnityEngine.Vector3.Distance(position, UnityEngine.Vector3Ex.WithY(fishingBobber.transform.position, position.y));\n\tif (num > ((num2 > 1.2f) ? 60f : 180f))\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.BadAngle);\n\t\treturn;\n\t}\n\tif (num2 > 1.2f && (float)lastSightCheck > 0.4f)\n\t{\n\t\tif (!GamePhysics.LineOfSight(ownerPlayer.eyes.position, fishingBobber.transform.position, 1084293377))\n\t\t{\n\t\t\tServer_Cancel(BaseFishingRod.FailReason.Obstructed);\n\t\t\treturn;\n\t\t}\n\t\tlastSightCheck = 0f;\n\t}\n\tif (UnityEngine.Vector3.Distance(position, fishingBobber.transform.position) > MaxCastDistance * 2f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TooFarAway);\n\t\treturn;\n\t}\n\tif (UnityEngine.Vector3.Distance(playerStartPosition, position) > 1f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.PlayerMoved);\n\t\treturn;\n\t}\n\tif (CurrentState == BaseFishingRod.CatchState.Waiting)\n\t{\n\t\tif ((float)catchTime < 0f)\n\t\t{\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_HookedSomething\"));\n\t\t\tCurrentState = BaseFishingRod.CatchState.Catching;\n\t\t\tfishingBobber.SetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\t\tnextFishStateChange = 0f;\n\t\t\tfishCatchDuration = 0f;\n\t\t\tstrainTimer = 0f;\n\t\t}\n\t\treturn;\n\t}\n\tBaseFishingRod.FishState fishState = currentFishState;\n\tif ((float)nextFishStateChange < 0f)\n\t{\n\t\tfloat num3 = Mathx.RemapValClamped(fishingBobber.TireAmount, 0f, 20f, 0f, 1f);\n\t\tif (currentFishState != 0)\n\t\t{\n\t\t\tcurrentFishState = (BaseFishingRod.FishState)0;\n\t\t\tnextFishStateChange = UnityEngine.Random.Range(2f, 4f) * (num3 + 1f);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnextFishStateChange = UnityEngine.Random.Range(3f, 7f) * (1f - num3);\n\t\t\tif (UnityEngine.Random.Range(0, 100) < 50)\n\t\t\t{\n\t\t\t\tcurrentFishState = BaseFishingRod.FishState.PullingLeft;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcurrentFishState = BaseFishingRod.FishState.PullingRight;\n\t\t\t}\n\t\t\tif (UnityEngine.Random.Range(0, 100) > 60 && UnityEngine.Vector3.Distance(fishingBobber.transform.position, ownerPlayer.transform.position) < MaxCastDistance - 2f)\n\t\t\t{\n\t\t\t\tcurrentFishState |= BaseFishingRod.FishState.PullingBack;\n\t\t\t}\n\t\t}\n\t}\n\tif ((float)fishCatchDuration > 120f)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TimeOut);\n\t\treturn;\n\t}\n\tbool flag = ownerPlayer.serverInput.IsDown(BUTTON.RIGHT);\n\tbool flag2 = ownerPlayer.serverInput.IsDown(BUTTON.LEFT);\n\tbool flag3 = HasReelInInput(ownerPlayer.serverInput);\n\tif (flag2 && flag)\n\t{\n\t\tflag2 = (flag = false);\n\t}\n\tUpdateFlags(flag2, flag, flag3);\n\tif (CurrentState == BaseFishingRod.CatchState.Waiting)\n\t{\n\t\tflag = (flag2 = (flag3 = false));\n\t}\n\tif (flag2 && !AllowPullInDirection(-ownerPlayer.eyes.HeadRight(), fishingBobber.transform.position))\n\t{\n\t\tflag2 = false;\n\t}\n\tif (flag && !AllowPullInDirection(ownerPlayer.eyes.HeadRight(), fishingBobber.transform.position))\n\t{\n\t\tflag = false;\n\t}\n\tfloat value = ownerPlayer.modifiers.GetValue(Modifier.ModifierType.FishingBoost, 1f);\n\tfishingBobber.ServerMovementUpdate(flag2, flag, flag3, ref currentFishState, position, fishableModifier, value);\n\tbool flag4 = false;\n\tfloat num4 = 0f;\n\tif (flag3 || flag2 || flag)\n\t{\n\t\tflag4 = true;\n\t\tnum4 = 0.5f;\n\t}\n\tif (currentFishState != 0 && flag4)\n\t{\n\t\tif (currentFishState.Contains(BaseFishingRod.FishState.PullingBack) && flag3)\n\t\t{\n\t\t\tnum4 = 1.5f;\n\t\t}\n\t\telse if ((currentFishState.Contains(BaseFishingRod.FishState.PullingLeft) || currentFishState.Contains(BaseFishingRod.FishState.PullingRight)) && flag3)\n\t\t{\n\t\t\tnum4 = 1.2f;\n\t\t}\n\t\telse if (currentFishState.Contains(BaseFishingRod.FishState.PullingLeft) && flag)\n\t\t{\n\t\t\tnum4 = 0.8f;\n\t\t}\n\t\telse if (currentFishState.Contains(BaseFishingRod.FishState.PullingRight) && flag2)\n\t\t{\n\t\t\tnum4 = 0.8f;\n\t\t}\n\t}\n\tif (flag3 && currentFishState != 0)\n\t{\n\t\tnum4 += 1f;\n\t}\n\tnum4 *= fishableModifier.StrainModifier * GlobalStrainSpeedMultiplier;\n\tnum4 -= ownerPlayer.modifiers.GetValue(Modifier.ModifierType.FishingBoost, 1f) - 1f;\n\tif (flag4)\n\t{\n\t\tstrainTimer += UnityEngine.Time.deltaTime * num4;\n\t}\n\telse\n\t{\n\t\tstrainTimer = UnityEngine.Mathf.MoveTowards(strainTimer, 0f, UnityEngine.Time.deltaTime * 1.5f);\n\t}\n\tfloat num5 = strainTimer / 6f;\n\tSetFlag(BaseEntity.Flags.Reserved1, flag4 && num5 > 0.25f);\n\tif ((float)lastStrainUpdate > 0.4f || fishState != currentFishState)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_UpdateFishState\"), (int)currentFishState, num5);\n\t\tlastStrainUpdate = 0f;\n\t}\n\tif (strainTimer > 7f || ForceFail)\n\t{\n\t\tServer_Cancel(BaseFishingRod.FailReason.TensionBreak);\n\t}\n\telse\n\t{\n\t\tif (!(num2 <= FishCatchDistance) && !ForceSuccess)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tCurrentState = BaseFishingRod.CatchState.Caught;\n\t\tif (currentFishTarget != null)\n\t\t{\n\t\t\tItem item = ItemManager.Create(currentFishTarget, 1, 0uL);\n\t\t\titem.SetItemOwnership(ownerPlayer, ItemOwnershipPhrases.Fishing);\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"CanCatchFish\", ownerPlayer, this, item);\n\t\t\tif (obj is bool && !(bool)obj)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tobject obj2 = Oxide.Core.Interface.CallHook(\"OnFishCatch\", item, this, ownerPlayer);\n\t\t\tif (obj2 is Item && obj2 as Item != item)\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t\titem = (Item)obj2;\n\t\t\t}\n\t\t\townerPlayer.GiveItem(item, BaseEntity.GiveItemReason.Crafted);\n\t\t\tif (currentFishTarget.shortname == \"skull.human\")\n\t\t\t{\n\t\t\t\titem.name = Facepunch.RandomUsernames.Get(UnityEngine.Random.Range(0, 1000));\n\t\t\t}\n\t\t\tif (Rust.GameInfo.HasAchievements && !string.IsNullOrEmpty(fishableModifier.SteamStatName))\n\t\t\t{\n\t\t\t\townerPlayer.stats.Add(fishableModifier.SteamStatName, 1);\n\t\t\t\townerPlayer.stats.Save(forceSteamSave: true);\n\t\t\t\tFishLookup.Instance.CheckCatchAllAchievement(ownerPlayer);\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnCaughtFish(ownerPlayer, item);\n\t\t\tif (!ConVar.Fishing.disableOverfishing && currentFishTarget.TryGetComponent<ItemModFishable>(out var component) && !component.IsJunk)\n\t\t\t{\n\t\t\t\tFishArea(fishingBobber.transform.position);\n\t\t\t}\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Client_OnCaughtFish\"), currentFishTarget.itemid);\n\t\t}\n\t\townerPlayer.SignalBroadcast(BaseEntity.Signal.Alt_Attack);\n\t\tInvoke(ResetLine, 6f);\n\t\tfishingBobber.Kill();\n\t\tcurrentBobber.Set(null);\n\t\tCancelInvoke(CatchProcess);\n\t\tOxide.Core.Interface.CallHook(\"OnFishCaught\", currentFishTarget, this, ownerPlayer);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "BaseFishingRod",
      "MethodName": "CatchProcessBudgeted",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Fuel": [
    {
      "Id": 4089079227,
      "Name": "OnFuelConsume",
      "FullName": "OnFuelConsume",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fuel consume occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ConsumeFuel(Item fuel, ItemModBurnable burnable)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnFuelConsume\", this, fuel, burnable) != null)\n\t{\n\t\treturn;\n\t}\n\tif (allowByproductCreation && burnable.byproductItem != null && UnityEngine.Random.Range(0f, 1f) > burnable.byproductChance)\n\t{\n\t\tint num = burnable.byproductAmount * GetCharcoalRate();\n\t\tbool flag = false;\n\t\tforeach (Item item2 in base.inventory.itemList)\n\t\t{\n\t\t\tif (item2.info == burnable.byproductItem && item2.amount + num < item2.info.stackable)\n\t\t\t{\n\t\t\t\titem2.amount += num;\n\t\t\t\titem2.MarkDirty();\n\t\t\t\tflag = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tItem item = ItemManager.Create(burnable.byproductItem, num, 0uL);\n\t\t\tif (!item.MoveToContainer(base.inventory))\n\t\t\t{\n\t\t\t\tOvenFull();\n\t\t\t\titem.Drop(base.inventory.dropPosition, base.inventory.dropVelocity);\n\t\t\t}\n\t\t}\n\t}\n\tif (fuel.amount <= GetFuelRate())\n\t{\n\t\tfuel.Remove();\n\t\treturn;\n\t}\n\tint fuelRate = GetFuelRate();\n\tfuel.fuel = burnable.fuelAmount;\n\tfuel.UseItem(fuelRate);\n\tOxide.Core.Interface.CallHook(\"OnFuelConsumed\", this, fuel, burnable);\n\tFacepunch.Rust.Analytics.Azure.AddPendingItems(this, fuel.info.shortname, fuelRate, \"smelt\");\n}\n",
      "ParametersText": "BaseOven baseOven",
      "TargetName": "BaseOven",
      "MethodName": "ConsumeFuel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 105375550,
      "Name": "OnFuelConsumed",
      "FullName": "OnFuelConsumed",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a fuel is consumed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ConsumeFuel(Item fuel, ItemModBurnable burnable)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnFuelConsume\", this, fuel, burnable) != null)\n\t{\n\t\treturn;\n\t}\n\tif (allowByproductCreation && burnable.byproductItem != null && UnityEngine.Random.Range(0f, 1f) > burnable.byproductChance)\n\t{\n\t\tint num = burnable.byproductAmount * GetCharcoalRate();\n\t\tbool flag = false;\n\t\tforeach (Item item2 in base.inventory.itemList)\n\t\t{\n\t\t\tif (item2.info == burnable.byproductItem && item2.amount + num < item2.info.stackable)\n\t\t\t{\n\t\t\t\titem2.amount += num;\n\t\t\t\titem2.MarkDirty();\n\t\t\t\tflag = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tItem item = ItemManager.Create(burnable.byproductItem, num, 0uL);\n\t\t\tif (!item.MoveToContainer(base.inventory))\n\t\t\t{\n\t\t\t\tOvenFull();\n\t\t\t\titem.Drop(base.inventory.dropPosition, base.inventory.dropVelocity);\n\t\t\t}\n\t\t}\n\t}\n\tif (fuel.amount <= GetFuelRate())\n\t{\n\t\tfuel.Remove();\n\t\treturn;\n\t}\n\tint fuelRate = GetFuelRate();\n\tfuel.fuel = burnable.fuelAmount;\n\tfuel.UseItem(fuelRate);\n\tOxide.Core.Interface.CallHook(\"OnFuelConsumed\", this, fuel, burnable);\n\tFacepunch.Rust.Analytics.Azure.AddPendingItems(this, fuel.info.shortname, fuelRate, \"smelt\");\n}\n",
      "ParametersText": "BaseOven baseOven",
      "TargetName": "BaseOven",
      "MethodName": "ConsumeFuel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3319857446,
      "Name": "OnFuelAmountCheck",
      "FullName": "OnFuelAmountCheck",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "entityFuelSystem",
          "typeName": "EntityFuelSystem",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fuel amount check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public int GetFuelAmount()\n{\n\tItem fuelItem = GetFuelItem();\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnFuelAmountCheck\", this, fuelItem);\n\tif (obj is int)\n\t{\n\t\treturn (int)obj;\n\t}\n\tif (fuelItem == null || fuelItem.amount < 1)\n\t{\n\t\treturn 0;\n\t}\n\treturn fuelItem.amount;\n}\n",
      "ParametersText": "EntityFuelSystem entityFuelSystem, Item local0",
      "TargetName": "EntityFuelSystem",
      "MethodName": "GetFuelAmount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    },
    {
      "Id": 2913063700,
      "Name": "OnFuelItemCheck",
      "FullName": "OnFuelItemCheck",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "entityFuelSystem",
          "typeName": "EntityFuelSystem",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "StorageContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fuel item check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item GetFuelItem()\n{\n\tStorageContainer fuelContainer = GetFuelContainer();\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnFuelItemCheck\", this, fuelContainer);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\tif (fuelContainer == null)\n\t{\n\t\treturn null;\n\t}\n\treturn fuelContainer.inventory.GetSlot(0);\n}\n",
      "ParametersText": "EntityFuelSystem entityFuelSystem, StorageContainer local0",
      "TargetName": "EntityFuelSystem",
      "MethodName": "GetFuelItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 436282086,
      "Name": "OnFuelCheck",
      "FullName": "OnFuelCheck",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "entityFuelSystem",
          "typeName": "EntityFuelSystem",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fuel check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool HasFuel(bool forceCheck = false)\n{\n\tif (UnityEngine.Time.time > nextFuelCheckTime || forceCheck)\n\t{\n\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnFuelCheck\", this);\n\t\tif (obj is bool)\n\t\t{\n\t\t\treturn (bool)obj;\n\t\t}\n\t\tcachedHasFuel = (float)GetFuelAmount() > 0f;\n\t\tnextFuelCheckTime = UnityEngine.Time.time + UnityEngine.Random.Range(1f, 2f);\n\t}\n\treturn cachedHasFuel;\n}\n",
      "ParametersText": "EntityFuelSystem entityFuelSystem",
      "TargetName": "EntityFuelSystem",
      "MethodName": "HasFuel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1390296394,
      "Name": "CanCheckFuel",
      "FullName": "CanCheckFuel",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "entityFuelSystem",
          "typeName": "EntityFuelSystem",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "StorageContainer",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to check fuel.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool IsInFuelInteractionRange(BasePlayer player)\n{\n\tStorageContainer fuelContainer = GetFuelContainer();\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanCheckFuel\", this, fuelContainer, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (fuelContainer != null)\n\t{\n\t\tfloat num = 0f;\n\t\tif (isServer)\n\t\t{\n\t\t\tnum = 3f;\n\t\t}\n\t\treturn fuelContainer.Distance(player.eyes.position) <= num;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "EntityFuelSystem entityFuelSystem, StorageContainer local0, BasePlayer player",
      "TargetName": "EntityFuelSystem",
      "MethodName": "IsInFuelInteractionRange",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 4053503248,
      "Name": "CanUseFuel",
      "FullName": "CanUseFuel",
      "Category": "Fuel",
      "Parameters": [
        {
          "name": "entityFuelSystem",
          "typeName": "EntityFuelSystem",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "StorageContainer",
          "optional": false
        },
        {
          "name": "seconds",
          "typeName": "System.Single",
          "optional": false
        },
        {
          "name": "fuelUsedPerSecond",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use fuel.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public int TryUseFuel(float seconds, float fuelUsedPerSecond)\n{\n\tStorageContainer fuelContainer = GetFuelContainer();\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanUseFuel\", this, fuelContainer, seconds, fuelUsedPerSecond);\n\tif (obj is int)\n\t{\n\t\treturn (int)obj;\n\t}\n\tif (fuelContainer.IsRealNull())\n\t{\n\t\treturn 0;\n\t}\n\tItem slot = fuelContainer.inventory.GetSlot(0);\n\tif (slot == null || slot.amount < 1)\n\t{\n\t\treturn 0;\n\t}\n\tpendingFuel += seconds * fuelUsedPerSecond;\n\tif (pendingFuel >= 1f)\n\t{\n\t\tint num = UnityEngine.Mathf.FloorToInt(pendingFuel);\n\t\tslot.UseItem(num);\n\t\tFacepunch.Rust.Analytics.Azure.AddPendingItems(fuelContainer?.GetParentEntity() ?? fuelContainer, slot.info.shortname, num, \"fuel_system\");\n\t\tpendingFuel -= num;\n\t\treturn num;\n\t}\n\treturn 0;\n}\n",
      "ParametersText": "EntityFuelSystem entityFuelSystem, StorageContainer local0, float seconds, float fuelUsedPerSecond",
      "TargetName": "EntityFuelSystem",
      "MethodName": "TryUseFuel",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    }
  ],
  "Industrial": [
    {
      "Id": 874753198,
      "Name": "OnConveyorFiltersChange",
      "FullName": "OnConveyorFiltersChange",
      "Category": "Industrial",
      "Parameters": [
        {
          "name": "industrialConveyor",
          "typeName": "IndustrialConveyor",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.IndustrialConveyor+ItemFilterList",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a conveyor filters is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_ChangeFilters(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player == null || !msg.player.CanBuild())\n\t{\n\t\treturn;\n\t}\n\tmode = (IndustrialConveyor.ConveyorMode)msg.read.Int32();\n\tfilterItems.Clear();\n\tusing ProtoBuf.IndustrialConveyor.ItemFilterList itemFilterList = msg.read.Proto<ProtoBuf.IndustrialConveyor.ItemFilterList>();\n\tif (itemFilterList.filters == null || Oxide.Core.Interface.CallHook(\"OnConveyorFiltersChange\", this, msg.player, itemFilterList) != null)\n\t{\n\t\treturn;\n\t}\n\tint num = UnityEngine.Mathf.Min(itemFilterList.filters.Count, 60);\n\tfor (int i = 0; i < num; i++)\n\t{\n\t\tif (filterItems.Count >= 30)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tIndustrialConveyor.ItemFilter item = new IndustrialConveyor.ItemFilter(itemFilterList.filters[i]);\n\t\tif (item.TargetItem != null || item.TargetCategory.HasValue)\n\t\t{\n\t\t\tfilterItems.Add(item);\n\t\t}\n\t}\n\tSendNetworkUpdate();\n\tfiltersNeedParsing = true;\n}\n",
      "ParametersText": "IndustrialConveyor industrialConveyor, BasePlayer player, ProtoBuf.IndustrialConveyor.ItemFilterList local0",
      "TargetName": "IndustrialConveyor",
      "MethodName": "RPC_ChangeFilters",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 276522030,
      "Name": "OnItemCraft",
      "FullName": "OnItemCraft [IndustrialCrafter]",
      "Category": "Industrial",
      "Parameters": [
        {
          "name": "industrialCrafter",
          "typeName": "IndustrialCrafter",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "ItemBlueprint",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is crafted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected override void RunJob()\n{\n\tbase.RunJob();\n\tif (ConVar.Server.industrialCrafterFrequency <= 0f || HasFlag(BaseEntity.Flags.Reserved1) || currentlyCrafting != null)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i <= 3; i++)\n\t{\n\t\tItem targetBlueprint = GetTargetBlueprint(i);\n\t\tif (targetBlueprint == null || GetWorkbench() == null || GetWorkbench().Workbenchlevel < targetBlueprint.blueprintTargetDef.Blueprint.GetWorkbenchLevel())\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tItemBlueprint blueprint = targetBlueprint.blueprintTargetDef.Blueprint;\n\t\tif (Oxide.Core.Interface.CallHook(\"OnItemCraft\", this, blueprint) != null)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tbool flag = true;\n\t\tforeach (ItemAmount ingredient in blueprint.GetIngredients())\n\t\t{\n\t\t\tif ((float)GetInputAmount(ingredient.itemDef) < ingredient.amount)\n\t\t\t{\n\t\t\t\tflag = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tflag = false;\n\t\tfor (int j = 9; j <= 12; j++)\n\t\t{\n\t\t\tItem slot = _inventory.GetSlot(j);\n\t\t\tif (slot == null || (slot.info == targetBlueprint.blueprintTargetDef && slot.amount + blueprint.amountToCreate <= slot.MaxStackable()))\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved2, b: true);\n\t\t\tcontinue;\n\t\t}\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b: false);\n\t\tforeach (ItemAmount ingredient2 in blueprint.GetIngredients())\n\t\t{\n\t\t\tConsumeInputIngredient(ingredient2);\n\t\t}\n\t\tcurrentlyCrafting = targetBlueprint.blueprintTargetDef;\n\t\tcurrentlyCraftingAmount = blueprint.amountToCreate;\n\t\tfloat num = blueprint.GetCraftTime();\n\t\tWorkbench workbench = GetWorkbench();\n\t\tif (workbench != null && workbench.InstalledUpgradeCount > 0)\n\t\t{\n\t\t\tnum *= workbench.GetCraftSpeedMultiplier(null);\n\t\t}\n\t\tInvoke(CompleteCraft, num);\n\t\tjobFinishes = num;\n\t\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\tClientRPC(RpcTarget.NetworkGroup(\"ClientUpdateCraftTimeRemaining\"), (float)jobFinishes, jobFinishes.Duration);\n\t\tbreak;\n\t}\n}\n",
      "ParametersText": "IndustrialCrafter industrialCrafter, ItemBlueprint local2",
      "TargetName": "IndustrialCrafter",
      "MethodName": "RunJob",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Item": [
    {
      "Id": 470300595,
      "Name": "OnItemRemovedFromContainer",
      "FullName": "OnItemRemovedFromContainer",
      "Category": "Item",
      "Parameters": [
        {
          "name": "itemContainer",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item removed from container occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool Remove(Item item)\n{\n\tif (!itemList.Contains(item))\n\t{\n\t\treturn false;\n\t}\n\tonPreItemRemove?.Invoke(item);\n\titemList.Remove(item);\n\titem.parent = null;\n\tonItemParentChanged?.Invoke(parent, item);\n\tonItemAddedRemoved?.Invoke(item, arg2: false);\n\tif (item.HasOnCycle)\n\t{\n\t\titemsWithOnCycle.Remove(item);\n\t\tif (CollectionEx.IsEmpty(itemsWithOnCycle))\n\t\t{\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref itemsWithOnCycle);\n\t\t}\n\t}\n\tItemContainer itemContainer = parent?.parent;\n\tif (itemContainer != null && itemContainer.onItemContentsChanged != null)\n\t{\n\t\titemContainer.onItemContentsChanged(item, arg2: false);\n\t}\n\tMarkDirty();\n\tOxide.Core.Interface.CallHook(\"OnItemRemovedFromContainer\", this, item);\n\treturn true;\n}\n",
      "ParametersText": "ItemContainer itemContainer",
      "TargetName": "ItemContainer",
      "MethodName": "Remove",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 199161889,
      "Name": "OnItemAddedToContainer",
      "FullName": "OnItemAddedToContainer",
      "Category": "Item",
      "Parameters": [
        {
          "name": "itemContainer",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item added to container occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool Insert(Item item)\n{\n\tif (itemList.Contains(item))\n\t{\n\t\treturn false;\n\t}\n\tif (IsFull())\n\t{\n\t\treturn false;\n\t}\n\titemList.Add(item);\n\titem.parent = this;\n\tif (!FindPosition(item))\n\t{\n\t\treturn false;\n\t}\n\tMarkDirty();\n\tif (onItemAddedRemoved != null)\n\t{\n\t\tonItemAddedRemoved(item, arg2: true);\n\t}\n\tif (item.HasOnCycle)\n\t{\n\t\tif (itemsWithOnCycle == null)\n\t\t{\n\t\t\titemsWithOnCycle = Facepunch.Pool.Get<ListHashSet<Item>>();\n\t\t}\n\t\titemsWithOnCycle.Add(item);\n\t}\n\tItemContainer itemContainer = parent?.parent;\n\tif (itemContainer != null && itemContainer.onItemContentsChanged != null)\n\t{\n\t\titemContainer.onItemContentsChanged(item, arg2: true);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnItemAddedToContainer\", this, item);\n\treturn true;\n}\n",
      "ParametersText": "ItemContainer itemContainer",
      "TargetName": "ItemContainer",
      "MethodName": "Insert",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1360889797,
      "Name": "CanAcceptItem",
      "FullName": "CanAcceptItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "itemContainer",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to accept item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public ItemContainer.CanAcceptResult CanAcceptItem(Item item, int targetPos)\n{\n\tif (canAcceptItem != null && !canAcceptItem(item, targetPos))\n\t{\n\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t}\n\tif (isServer && availableSlots != null && availableSlots.Count > 0)\n\t{\n\t\tif (item.info.occupySlots == (ItemSlot)0 || item.info.occupySlots == ItemSlot.None)\n\t\t{\n\t\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t\t}\n\t\tif (item.isBroken)\n\t\t{\n\t\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t\t}\n\t\tint num = 0;\n\t\tforeach (ItemSlot availableSlot in availableSlots)\n\t\t{\n\t\t\tnum |= (int)availableSlot;\n\t\t}\n\t\tif (((uint)num & (uint)item.info.occupySlots) != (uint)item.info.occupySlots)\n\t\t{\n\t\t\treturn ItemContainer.CanAcceptResult.CannotAcceptRightNow;\n\t\t}\n\t}\n\tif ((allowedContents & item.info.itemType) != item.info.itemType)\n\t{\n\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t}\n\tif (HasLimitedAllowedItems)\n\t{\n\t\tbool flag = false;\n\t\tfor (int i = 0; i < onlyAllowedItems.Length; i++)\n\t\t{\n\t\t\tif (onlyAllowedItems[i] == item.info)\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t\t}\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAcceptItem\", this, item, targetPos);\n\tif (obj is ItemContainer.CanAcceptResult)\n\t{\n\t\treturn (ItemContainer.CanAcceptResult)obj;\n\t}\n\tif (blockedItems != null && blockedItems.Contains(item.info))\n\t{\n\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t}\n\tif (item.GetItemVolume() > containerVolume)\n\t{\n\t\treturn ItemContainer.CanAcceptResult.CannotAccept;\n\t}\n\treturn ItemContainer.CanAcceptResult.CanAccept;\n}\n",
      "ParametersText": "ItemContainer itemContainer",
      "TargetName": "ItemContainer",
      "MethodName": "CanAcceptItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "ItemContainer.CanAcceptResult"
    },
    {
      "Id": 276522030,
      "Name": "OnItemCraft",
      "FullName": "OnItemCraft",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "ItemCraftTask",
          "optional": false
        },
        {
          "name": "owner",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "fromTempBlueprint",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is crafted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CraftItem(ItemBlueprint bp, BasePlayer owner, ProtoBuf.Item.InstanceData instanceData = null, int amount = 1, int skinID = 0, Item fromTempBlueprint = null, bool free = false)\n{\n\tif (owner != null && (owner.IsTransferring() || owner.IsSleeping()))\n\t{\n\t\treturn false;\n\t}\n\tif (!CanCraft(bp, amount, free))\n\t{\n\t\treturn false;\n\t}\n\ttaskUID++;\n\tItemCraftTask itemCraftTask = Facepunch.Pool.Get<ItemCraftTask>();\n\titemCraftTask.blueprint = bp;\n\tif (!free)\n\t{\n\t\tCollectIngredients(bp, itemCraftTask, amount, owner, takeBroken: false);\n\t}\n\titemCraftTask.endTime = 0f;\n\titemCraftTask.taskUID = taskUID;\n\titemCraftTask.numCrafted = 0;\n\titemCraftTask.instanceData = instanceData;\n\tif (itemCraftTask.instanceData != null)\n\t{\n\t\titemCraftTask.instanceData.ShouldPool = false;\n\t}\n\titemCraftTask.amount = amount;\n\titemCraftTask.skinID = skinID;\n\tif (fromTempBlueprint != null && itemCraftTask.takenItems != null)\n\t{\n\t\tfromTempBlueprint.RemoveFromContainer();\n\t\titemCraftTask.takenItems.Add(fromTempBlueprint);\n\t\titemCraftTask.conditionScale = 0.5f;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemCraft\", itemCraftTask, owner, fromTempBlueprint);\n\tif (obj is bool)\n\t{\n\t\tif (fromTempBlueprint != null && itemCraftTask.instanceData != null)\n\t\t{\n\t\t\tfromTempBlueprint.instanceData = itemCraftTask.instanceData;\n\t\t}\n\t\treturn (bool)obj;\n\t}\n\tqueue.AddLast(itemCraftTask);\n\tif (owner != null)\n\t{\n\t\towner.Command(\"note.craft_add\", itemCraftTask.taskUID, itemCraftTask.blueprint.targetItem.itemid, amount, itemCraftTask.skinID);\n\t}\n\treturn true;\n}\n",
      "ParametersText": "ItemCraftTask local0, BasePlayer owner, Item fromTempBlueprint",
      "TargetName": "ItemCrafter",
      "MethodName": "CraftItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 659159968,
      "Name": "OnItemCraftFinished",
      "FullName": "OnItemCraftFinished",
      "Category": "Item",
      "Parameters": [
        {
          "name": "task",
          "typeName": "ItemCraftTask",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "itemCrafter",
          "typeName": "ItemCrafter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item craft finishes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FinishCrafting(ItemCraftTask task)\n{\n\ttask.amount--;\n\ttask.numCrafted++;\n\tulong skin = ItemDefinition.FindSkin(task.blueprint.targetItem.itemid, task.skinID);\n\tItem item2 = ItemManager.CreateByItemID(task.blueprint.targetItem.itemid, 1, skin);\n\titem2.amount = task.blueprint.amountToCreate;\n\tint amount = item2.amount;\n\t_ = owner.currentCraftLevel;\n\tbool inSafezone = owner.InSafeZone();\n\tif (item2.hasCondition && task.conditionScale != 1f)\n\t{\n\t\titem2.maxCondition *= task.conditionScale;\n\t\titem2.condition = item2.maxCondition;\n\t}\n\titem2.OnVirginSpawn(owner);\n\titem2.SetItemOwnership(owner, ItemOwnershipPhrases.CraftedPhrase);\n\tif (task.workbenchEntity != null && task.workbenchEntity is Workbench workbench)\n\t{\n\t\tworkbench.ApplyUpgradesToCraftedItem(owner, task, item2);\n\t\tworkbench.GiveBonusItems(owner, task, item2);\n\t}\n\tforeach (ItemAmount ingredient in task.blueprint.GetIngredients())\n\t{\n\t\tint num = (int)ingredient.amount;\n\t\tif (task.takenItems == null)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tforeach (Item takenItem in task.takenItems)\n\t\t{\n\t\t\tif (takenItem.info == ingredient.itemDef)\n\t\t\t{\n\t\t\t\tint num2 = UnityEngine.Mathf.Min(takenItem.amount, num);\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnCraftMaterialConsumed(takenItem.info.shortname, num, base.baseEntity, task.workbenchEntity, inSafezone, item2.info.shortname);\n\t\t\t\ttakenItem.UseItem(num);\n\t\t\t\tnum -= num2;\n\t\t\t}\n\t\t\tif (num <= 0)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\ttask.takenItems?.RemoveAll((Item item) => item.amount == 0);\n\tFacepunch.Rust.Analytics.Azure.OnCraftItem(item2.info.shortname, item2.amount, base.baseEntity, task.workbenchEntity, inSafezone, item2.skin);\n\towner.Command(\"note.craft_done\", task.taskUID, 1, task.amount);\n\tOxide.Core.Interface.CallHook(\"OnItemCraftFinished\", task, item2, this);\n\tif (task.instanceData != null)\n\t{\n\t\titem2.instanceData = task.instanceData;\n\t}\n\tif (!string.IsNullOrEmpty(task.blueprint.UnlockAchievment))\n\t{\n\t\towner.GiveAchievement(task.blueprint.UnlockAchievment);\n\t}\n\towner.ProcessMissionEvent(BaseMission.MissionEventType.CRAFT_ITEM, item2.info.itemid, amount);\n\tif (owner.inventory.GiveItem(item2))\n\t{\n\t\towner.Command(\"note.inv\", item2.info.itemid, amount);\n\t\treturn;\n\t}\n\tItemContainer itemContainer = System.Linq.Enumerable.First(containers);\n\towner.Command(\"note.inv\", item2.info.itemid, amount);\n\towner.Command(\"note.inv\", item2.info.itemid, -item2.amount);\n\titem2.Drop(itemContainer.dropPosition, itemContainer.dropVelocity);\n}\n",
      "ParametersText": "ItemCraftTask task, Item local1, ItemCrafter itemCrafter",
      "TargetName": "ItemCrafter",
      "MethodName": "FinishCrafting",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 195516419,
      "Name": "OnItemCraftCancelled",
      "FullName": "OnItemCraftCancelled",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "ItemCraftTask",
          "optional": false
        },
        {
          "name": "itemCrafter",
          "typeName": "ItemCrafter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item craft is cancelled."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CancelTask(int iID)\n{\n\tif (queue.Count == 0)\n\t{\n\t\treturn false;\n\t}\n\tif (owner != null && owner.IsTransferring())\n\t{\n\t\treturn false;\n\t}\n\tItemCraftTask itemCraftTask = System.Linq.Enumerable.FirstOrDefault(queue, (ItemCraftTask x) => x.taskUID == iID && !x.cancelled);\n\tif (itemCraftTask == null)\n\t{\n\t\treturn false;\n\t}\n\titemCraftTask.cancelled = true;\n\tif (owner == null)\n\t{\n\t\treturn true;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnItemCraftCancelled\", itemCraftTask, this);\n\towner.Command(\"note.craft_done\", itemCraftTask.taskUID, 0);\n\tif (itemCraftTask.takenItems != null && itemCraftTask.takenItems.Count > 0)\n\t{\n\t\tforeach (Item takenItem in itemCraftTask.takenItems)\n\t\t{\n\t\t\tif (takenItem != null && takenItem.amount > 0)\n\t\t\t{\n\t\t\t\tif (takenItem.IsBlueprint() && takenItem.blueprintTargetDef == itemCraftTask.blueprint.targetItem)\n\t\t\t\t{\n\t\t\t\t\ttakenItem.UseItem(itemCraftTask.numCrafted);\n\t\t\t\t}\n\t\t\t\tif (takenItem.amount > 0 && !takenItem.MoveToContainer(owner.inventory.containerMain))\n\t\t\t\t{\n\t\t\t\t\ttakenItem.Drop(owner.inventory.containerMain.dropPosition + UnityEngine.Random.value * UnityEngine.Vector3.down + UnityEngine.Random.insideUnitSphere, owner.inventory.containerMain.dropVelocity);\n\t\t\t\t\towner.Command(\"note.inv\", takenItem.info.itemid, -takenItem.amount);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\titemCraftTask.takenItems.Clear();\n\t}\n\treturn true;\n}\n",
      "ParametersText": "ItemCraftTask local1, ItemCrafter itemCrafter",
      "TargetName": "ItemCrafter",
      "MethodName": "CancelTask",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2901690581,
      "Name": "CanFastTrackCraftTask",
      "FullName": "CanFastTrackCraftTask",
      "Category": "Item",
      "Parameters": [
        {
          "name": "itemCrafter",
          "typeName": "ItemCrafter",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "ItemCraftTask",
          "optional": false
        },
        {
          "name": "taskID",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to fast track craft task.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool FastTrackTask(int taskID)\n{\n\tint taskID2 = taskID;\n\tif (queue.Count == 0)\n\t{\n\t\treturn false;\n\t}\n\tif (owner != null && owner.IsTransferring())\n\t{\n\t\treturn false;\n\t}\n\tItemCraftTask value = queue.First.Value;\n\tif (value == null)\n\t{\n\t\treturn false;\n\t}\n\tItemCraftTask itemCraftTask = System.Linq.Enumerable.FirstOrDefault(queue, (ItemCraftTask x) => x.taskUID == taskID2 && !x.cancelled);\n\tif (itemCraftTask == null)\n\t{\n\t\treturn false;\n\t}\n\tif (itemCraftTask == value)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanFastTrackCraftTask\", this, itemCraftTask, taskID);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tvalue.endTime = 0f;\n\tqueue.Remove(itemCraftTask);\n\tqueue.AddFirst(itemCraftTask);\n\towner.Command(\"note.craft_fasttracked\", taskID2);\n\treturn true;\n}\n",
      "ParametersText": "ItemCrafter itemCrafter, ItemCraftTask local2, int taskID",
      "TargetName": "ItemCrafter",
      "MethodName": "FastTrackTask",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 470287711,
      "Name": "OnItemDeployed",
      "FullName": "OnItemDeployed [Regular]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "deployer",
          "typeName": "Deployer",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "ItemModDeployable",
          "optional": false
        },
        {
          "name": "local6",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is deployed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoDeploy_Regular(Deployable deployable, UnityEngine.Ray ray)\n{\n\tif (!HasItemAmount())\n\t{\n\t\treturn;\n\t}\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn;\n\t}\n\tif (!ownerPlayer.CanBuild())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.NoPermission, false);\n\t}\n\telse if (ConVar.AntiHack.objectplacement && ownerPlayer.TriggeredMovementAntiHack())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.AntihackWithReason, false, ownerPlayer.lastViolationType.ToString());\n\t}\n\telse\n\t{\n\t\tif (!CheckPlacement(deployable, ray, 8f) || !UnityEngine.Physics.Raycast(ray, out var hitInfo, 8f, 1235288065))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tUnityEngine.Vector3 point = hitInfo.point;\n\t\tUnityEngine.Quaternion deployedRotation = GetDeployedRotation(hitInfo.normal, ray.direction);\n\t\tItem ownerItem = GetOwnerItem();\n\t\tItemModDeployable modDeployable = GetModDeployable();\n\t\tif (ownerPlayer.Distance(point) > 3f)\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.TooFarAway, false);\n\t\t\treturn;\n\t\t}\n\t\tif (!ownerPlayer.CanBuild(point, deployedRotation, deployable.bounds))\n\t\t{\n\t\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.NoPermission, false);\n\t\t\treturn;\n\t\t}\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(modDeployable.entityPrefab.resourcePath, point, deployedRotation);\n\t\tif (!baseEntity)\n\t\t{\n\t\t\tUnityEngine.Debug.LogWarning(\"Couldn't create prefab:\" + modDeployable.entityPrefab.resourcePath);\n\t\t\treturn;\n\t\t}\n\t\tbaseEntity.skinID = ownerItem.skin;\n\t\tbaseEntity.SendMessage(\"SetDeployedBy\", ownerPlayer, UnityEngine.SendMessageOptions.DontRequireReceiver);\n\t\tbaseEntity.OwnerID = ownerPlayer.userID;\n\t\tbaseEntity.Spawn();\n\t\tmodDeployable.OnDeployed(baseEntity, ownerPlayer);\n\t\tOxide.Core.Interface.CallHook(\"OnItemDeployed\", this, modDeployable, baseEntity);\n\t\tFacepunch.Rust.Analytics.Azure.OnEntityBuilt(baseEntity, ownerPlayer);\n\t\tUseItemAmount(1);\n\t}\n}\n",
      "ParametersText": "Deployer deployer, ItemModDeployable local5, BaseEntity local6",
      "TargetName": "Deployer",
      "MethodName": "DoDeploy_Regular",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 470287711,
      "Name": "OnItemDeployed",
      "FullName": "OnItemDeployed [Slot]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "deployer",
          "typeName": "Deployer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is deployed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoDeploy_Slot(Deployable deployable, UnityEngine.Ray ray, NetworkableId entityID)\n{\n\tif (!HasItemAmount())\n\t{\n\t\treturn;\n\t}\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn;\n\t}\n\tif (!ownerPlayer.CanBuild())\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.NoPermission, false);\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = BaseNetworkable.serverEntities.Find(entityID) as BaseEntity;\n\tif (baseEntity == null || !baseEntity.HasSlot(deployable.slot) || baseEntity.GetSlot(deployable.slot) != null)\n\t{\n\t\treturn;\n\t}\n\tif (ownerPlayer.Distance(baseEntity) > 3f)\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.TooFarAway, false);\n\t\treturn;\n\t}\n\tif (!ownerPlayer.CanBuild(baseEntity.WorldSpaceBounds()))\n\t{\n\t\townerPlayer.ShowToast(GameTip.Styles.Error, ConstructionErrors.NoPermission, false);\n\t\treturn;\n\t}\n\tif (ownerPlayer.IsInTutorial)\n\t{\n\t\tTutorialIsland currentTutorialIsland = ownerPlayer.GetCurrentTutorialIsland();\n\t\tif (currentTutorialIsland != null && !currentTutorialIsland.CheckPlacement(ownerPlayer, deployable, baseEntity.transform.position, baseEntity.transform.rotation))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\tItem ownerItem = GetOwnerItem();\n\tItemModDeployable modDeployable = GetModDeployable();\n\tBaseEntity baseEntity2 = GameManager.server.CreateEntity(modDeployable.entityPrefab.resourcePath);\n\tif (baseEntity2 != null)\n\t{\n\t\tbaseEntity2.skinID = ownerItem.skin;\n\t\tbaseEntity2.SetParent(baseEntity, baseEntity.GetSlotAnchorName(deployable.slot));\n\t\tbaseEntity2.OwnerID = ownerPlayer.userID;\n\t\tbaseEntity2.OnDeployed(baseEntity, ownerPlayer, ownerItem);\n\t\tbaseEntity2.Spawn();\n\t\tbaseEntity.SetSlot(deployable.slot, baseEntity2);\n\t\tif (deployable.placeEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(deployable.placeEffect.resourcePath, baseEntity.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tif (ownerPlayer.IsInTutorial)\n\t\t{\n\t\t\tTutorialIsland currentTutorialIsland2 = ownerPlayer.GetCurrentTutorialIsland();\n\t\t\tif (currentTutorialIsland2 != null)\n\t\t\t{\n\t\t\t\tcurrentTutorialIsland2.OnPlayerBuiltConstruction(ownerPlayer);\n\t\t\t}\n\t\t}\n\t\tif (GetOwnerItemDefinition() != null)\n\t\t{\n\t\t\townerPlayer.ProcessMissionEvent(BaseMission.MissionEventType.DEPLOY, new BaseMission.MissionEventPayload\n\t\t\t{\n\t\t\t\tWorldPosition = baseEntity2.transform.position,\n\t\t\t\tUintIdentifier = baseEntity2.prefabID,\n\t\t\t\tIntIdentifier = GetOwnerItemDefinition().itemid\n\t\t\t}, 1f);\n\t\t}\n\t}\n\tmodDeployable.OnDeployed(baseEntity2, ownerPlayer);\n\tOxide.Core.Interface.CallHook(\"OnItemDeployed\", this, baseEntity, baseEntity2);\n\tFacepunch.Rust.Analytics.Azure.OnEntityBuilt(baseEntity2, ownerPlayer);\n\tif (!ownerPlayer.IsInCreativeMode || !ConVar.Creative.freeBuild)\n\t{\n\t\tUseItemAmount(1);\n\t}\n}\n",
      "ParametersText": "Deployer deployer, BaseEntity local1, BaseEntity local4",
      "TargetName": "Deployer",
      "MethodName": "DoDeploy_Slot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 208822718,
      "Name": "CanDeployItem",
      "FullName": "CanDeployItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "deployer",
          "typeName": "Deployer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "NetworkableId",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to deploy item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void DoDeploy(BaseEntity.RPCMessage msg)\n{\n\tif (!msg.player.CanInteract())\n\t{\n\t\treturn;\n\t}\n\tDeployable deployable = GetDeployable();\n\tif (deployable == null)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Ray ray = msg.read.Ray();\n\tNetworkableId networkableId = msg.read.EntityID();\n\tif (Oxide.Core.Interface.CallHook(\"CanDeployItem\", msg.player, this, networkableId) == null)\n\t{\n\t\tif (deployable.toSlot)\n\t\t{\n\t\t\tDoDeploy_Slot(deployable, ray, networkableId);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tDoDeploy_Regular(deployable, ray);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer player, Deployer deployer, NetworkableId local2",
      "TargetName": "Deployer",
      "MethodName": "DoDeploy",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2897106601,
      "Name": "OnItemUse",
      "FullName": "OnItemUse",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "amountToConsume",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item uses."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UseItem(int amountToConsume = 1)\n{\n\tif (amountToConsume > 0)\n\t{\n\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemUse\", this, amountToConsume);\n\t\tif (obj is int)\n\t\t{\n\t\t\tamountToConsume = (int)obj;\n\t\t}\n\t\tamount -= amountToConsume;\n\t\tReduceItemOwnership(amountToConsume);\n\t\tif (amount <= 0)\n\t\t{\n\t\t\tamount = 0;\n\t\t\tRemove();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tMarkDirty();\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item item, int amountToConsume",
      "TargetName": "Item",
      "MethodName": "UseItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 983035860,
      "Name": "OnItemSplit",
      "FullName": "OnItemSplit",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item split occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic Item SplitItem(int split_Amount)\n{\n\tUnityEngine.Assertions.Assert.IsTrue(split_Amount > 0, \"split_Amount <= 0\");\n\tif (split_Amount <= 0)\n\t{\n\t\treturn null;\n\t}\n\tif (split_Amount >= amount)\n\t{\n\t\treturn null;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemSplit\", this, split_Amount);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\tamount -= split_Amount;\n\tItem item = ItemManager.CreateByItemID(info.itemid, split_Amount, skin);\n\tMigrateItemOwnership(item, split_Amount);\n\tif (IsBlueprint())\n\t{\n\t\titem.blueprintTarget = blueprintTarget;\n\t}\n\titem.iconImageId = iconImageId;\n\titem.name = name;\n\tif (info.amountType == ItemDefinition.AmountType.Genetics && instanceData != null && instanceData.dataInt != 0)\n\t{\n\t\titem.instanceData = new ProtoBuf.Item.InstanceData();\n\t\titem.instanceData.dataInt = instanceData.dataInt;\n\t\titem.instanceData.ShouldPool = false;\n\t}\n\tif (instanceData != null && instanceData.dataInt > 0 && info != null && info.Blueprint != null && info.Blueprint.GetWorkbenchLevel() == 3)\n\t{\n\t\titem.instanceData = new ProtoBuf.Item.InstanceData();\n\t\titem.instanceData.dataInt = instanceData.dataInt;\n\t\titem.instanceData.ShouldPool = false;\n\t\titem.SetFlag(Item.Flag.IsOn, IsOn());\n\t}\n\tif (instanceData != null && (bool)info.GetComponent<ItemModFoodSpoiling>())\n\t{\n\t\titem.instanceData = new ProtoBuf.Item.InstanceData();\n\t\titem.instanceData.dataFloat = instanceData.dataFloat;\n\t\titem.instanceData.ShouldPool = false;\n\t}\n\tMarkDirty();\n\treturn item;\n}\n",
      "ParametersText": "Item item",
      "TargetName": "Item",
      "MethodName": "SplitItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 2594779146,
      "Name": "CanStackItem",
      "FullName": "CanStackItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to stack item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanStack(Item item)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanStackItem\", this, item);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (item == this)\n\t{\n\t\treturn false;\n\t}\n\tif (MaxStackable() <= 1)\n\t{\n\t\treturn false;\n\t}\n\tif (item.info.stackable <= 1)\n\t{\n\t\treturn false;\n\t}\n\tif (item.info.itemid != info.itemid)\n\t{\n\t\treturn false;\n\t}\n\tif (hasCondition && condition != item.info.condition.max)\n\t{\n\t\treturn false;\n\t}\n\tif (item.hasCondition && item.condition != item.info.condition.max)\n\t{\n\t\treturn false;\n\t}\n\tif (!IsValid())\n\t{\n\t\treturn false;\n\t}\n\tif (IsBlueprint() && blueprintTarget != item.blueprintTarget)\n\t{\n\t\treturn false;\n\t}\n\tif (item.skin != skin)\n\t{\n\t\treturn false;\n\t}\n\tif ((!string.IsNullOrEmpty(item.name) || !string.IsNullOrEmpty(name)) && item.name != name)\n\t{\n\t\treturn false;\n\t}\n\tif (item.iconImageId != iconImageId)\n\t{\n\t\treturn false;\n\t}\n\tif (item.info.amountType == ItemDefinition.AmountType.Genetics || info.amountType == ItemDefinition.AmountType.Genetics)\n\t{\n\t\tint num = ((item.instanceData != null) ? item.instanceData.dataInt : (-1));\n\t\tint num2 = ((instanceData != null) ? instanceData.dataInt : (-1));\n\t\tif (num != num2)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tif (item.instanceData != null && instanceData != null && (item.IsOn() != IsOn() || (item.instanceData.dataInt != instanceData.dataInt && item.info.Blueprint != null && item.info.Blueprint.GetWorkbenchLevel() == 3)))\n\t{\n\t\treturn false;\n\t}\n\tif (instanceData != null && instanceData.subEntity.IsValid && (bool)info.GetComponent<ItemModSign>())\n\t{\n\t\treturn false;\n\t}\n\tif (item.instanceData != null && item.instanceData.subEntity.IsValid && (bool)item.info.GetComponent<ItemModSign>())\n\t{\n\t\treturn false;\n\t}\n\tif (BlockStackFoodItem(item, this))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "Item item, Item item",
      "TargetName": "Item",
      "MethodName": "CanStack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 226172740,
      "Name": "OnItemDropped",
      "FullName": "OnItemDropped",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public BaseEntity Drop(UnityEngine.Vector3 vPos, UnityEngine.Vector3 vVelocity, UnityEngine.Quaternion rotation = default(UnityEngine.Quaternion))\n{\n\tulong droppedBy = GetRootContainer()?.playerOwner?.userID ?? ((EncryptedValue<ulong>)0uL);\n\tRemoveFromWorld();\n\tif (info.AlignWorldModelOnDrop)\n\t{\n\t\trotation = UnityEngine.Quaternion.Euler(0f, UnityEngine.Quaternion.LookRotation(vVelocity.normalized, UnityEngine.Vector3.up).eulerAngles.y, 0f);\n\t\trotation = UnityEngine.Quaternion.Euler(info.WorldModelDropOffset) * rotation;\n\t}\n\tBaseEntity baseEntity = null;\n\tif (vPos != UnityEngine.Vector3.zero && !info.HasFlag(ItemDefinition.Flag.NoDropping))\n\t{\n\t\tbaseEntity = CreateWorldObject(vPos, rotation);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tbaseEntity.SetVelocity(vVelocity);\n\t\t}\n\t\tif (baseEntity is DroppedItem droppedItem)\n\t\t{\n\t\t\tdroppedItem.DroppedBy = droppedBy;\n\t\t\tif (info.AdjustCenterOfMassOnDrop)\n\t\t\t{\n\t\t\t\tdroppedItem.Rigidbody.centerOfMass = info.DropCenterOfMass;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tRemove();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnItemDropped\", this, baseEntity);\n\tRemoveFromContainer();\n\treturn baseEntity;\n}\n",
      "ParametersText": "Item item, BaseEntity local1",
      "TargetName": "Item",
      "MethodName": "Drop",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 418610024,
      "Name": "OnMaxStackable",
      "FullName": "OnMaxStackable",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when max stackable occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public int MaxStackable()\n{\n\tint num = info.stackable;\n\tif (parent != null && parent.maxStackSize > 0)\n\t{\n\t\tnum = UnityEngine.Mathf.Min(parent.maxStackSize, num);\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnMaxStackable\", this);\n\tif (obj is int)\n\t{\n\t\treturn (int)obj;\n\t}\n\treturn num;\n}\n",
      "ParametersText": "Item item",
      "TargetName": "Item",
      "MethodName": "MaxStackable",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    },
    {
      "Id": 4018892167,
      "Name": "OnItemRemove",
      "FullName": "OnItemRemove",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Remove(float fTime = 0f)\n{\n\tif (removeTime > 0f || Oxide.Core.Interface.CallHook(\"OnItemRemove\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (isServer)\n\t{\n\t\tItemMod[] itemMods = info.itemMods;\n\t\tfor (int i = 0; i < itemMods.Length; i++)\n\t\t{\n\t\t\titemMods[i].OnRemove(this);\n\t\t}\n\t}\n\tremoveTime = UnityEngine.Time.time + fTime;\n\tthis.OnDirty = null;\n\tposition = -1;\n\tItemManager.RemoveItem(this, fTime);\n}\n",
      "ParametersText": "Item item",
      "TargetName": "Item",
      "MethodName": "Remove",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 746311991,
      "Name": "OnItemStacked",
      "FullName": "OnItemStacked [1]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local13",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "newcontainer",
          "typeName": "ItemContainer",
          "optional": false
        },
        {
          "name": "local15",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is stacked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool MoveToContainer(ItemContainer newcontainer, int iTargetPos = -1, bool allowStack = true, bool ignoreStackLimit = false, BasePlayer sourcePlayer = null, bool allowSwap = true)\n{\n\tusing (TimeWarning.New(\"MoveToContainer\"))\n\t{\n\t\tBasePlayer playerOwner = newcontainer.playerOwner;\n\t\tif (playerOwner != null && playerOwner.IsDead() && parent != null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = iTargetPos == -1;\n\t\tItemContainer itemContainer = parent;\n\t\tif (iTargetPos == -1)\n\t\t{\n\t\t\tif (allowStack && info.stackable > 1)\n\t\t\t{\n\t\t\t\tBufferList<Item> obj = Facepunch.Pool.Get<BufferList<Item>>();\n\t\t\t\tnewcontainer.FindItemsByItemID(info.itemid, obj);\n\t\t\t\tforeach (Item item3 in obj)\n\t\t\t\t{\n\t\t\t\t\tif (item3.position > iTargetPos && item3.CanStack(this) && (ignoreStackLimit || item3.amount < item3.MaxStackable()))\n\t\t\t\t\t{\n\t\t\t\t\t\tiTargetPos = item3.position;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.Free(ref obj, freeElements: false);\n\t\t\t}\n\t\t\tif (iTargetPos == -1 && newcontainer.GetEntityOwner(returnHeldEntity: true) is IIdealSlotEntity idealSlotEntity)\n\t\t\t{\n\t\t\t\tiTargetPos = idealSlotEntity.GetIdealSlot(sourcePlayer, newcontainer, this);\n\t\t\t\tif (iTargetPos == int.MinValue)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (iTargetPos == -1)\n\t\t\t{\n\t\t\t\tif (newcontainer == parent)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbool flag2 = newcontainer.HasFlag(ItemContainer.Flag.Clothing) && info.isWearable;\n\t\t\t\tItemModWearable itemModWearable = info.ItemModWearable;\n\t\t\t\tfor (int i = 0; i < newcontainer.capacity; i++)\n\t\t\t\t{\n\t\t\t\t\tItem slot = newcontainer.GetSlot(i);\n\t\t\t\t\tif (slot == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (CanMoveTo(newcontainer, i))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiTargetPos = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (flag2 && slot != null && !slot.info.ItemModWearable.CanExistWith(itemModWearable))\n\t\t\t\t\t{\n\t\t\t\t\t\tiTargetPos = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (newcontainer.HasAvailableSlotsDefined && DoItemSlotsConflict(slot))\n\t\t\t\t\t{\n\t\t\t\t\t\tiTargetPos = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (flag2 && iTargetPos == -1)\n\t\t\t\t{\n\t\t\t\t\tiTargetPos = newcontainer.capacity - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (iTargetPos == -1)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanMoveTo(newcontainer, iTargetPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (iTargetPos >= 0 && newcontainer.SlotTaken(this, iTargetPos))\n\t\t{\n\t\t\tItem slot2 = newcontainer.GetSlot(iTargetPos);\n\t\t\tif (slot2 == this)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (allowStack && slot2 != null)\n\t\t\t{\n\t\t\t\tint num = slot2.MaxStackable();\n\t\t\t\tif (slot2.CanStack(this))\n\t\t\t\t{\n\t\t\t\t\tif (ignoreStackLimit)\n\t\t\t\t\t{\n\t\t\t\t\t\tnum = int.MaxValue;\n\t\t\t\t\t}\n\t\t\t\t\tif (slot2.amount >= num)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tint num2 = UnityEngine.Mathf.Min(num - slot2.amount, amount);\n\t\t\t\t\tslot2.amount += num2;\n\t\t\t\t\tif (slot2.instanceData != null && instanceData != null && (bool)info.GetComponent<ItemModFoodSpoiling>())\n\t\t\t\t\t{\n\t\t\t\t\t\tslot2.instanceData.dataFloat = UnityEngine.Mathf.Min(slot2.instanceData.dataFloat, instanceData.dataFloat);\n\t\t\t\t\t}\n\t\t\t\t\tnewcontainer.onItemAddedToStack?.Invoke(slot2, num2);\n\t\t\t\t\tamount -= num2;\n\t\t\t\t\tslot2.MarkDirty();\n\t\t\t\t\tOxide.Core.Interface.CallHook(\"OnItemStacked\", slot2, this, newcontainer, num2);\n\t\t\t\t\tMarkDirty();\n\t\t\t\t\tMigrateItemOwnership(slot2, num2);\n\t\t\t\t\tif (amount <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRemoveFromWorld();\n\t\t\t\t\t\tRemoveFromContainer();\n\t\t\t\t\t\tRemove();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (flag)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn MoveToContainer(newcontainer, -1, allowStack, ignoreStackLimit, sourcePlayer);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (parent != null && allowSwap && slot2 != null)\n\t\t\t{\n\t\t\t\tItemContainer itemContainer2 = parent;\n\t\t\t\tint iTargetPos2 = position;\n\t\t\t\tItemContainer newcontainer2 = slot2.parent;\n\t\t\t\tint num3 = slot2.position;\n\t\t\t\tif (!slot2.CanMoveTo(itemContainer2, iTargetPos2))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (itemContainer2.maxStackSize > 0 && slot2.amount > itemContainer2.maxStackSize)\n\t\t\t\t{\n\t\t\t\t\tItem item = slot2.SplitItem(slot2.amount - itemContainer2.maxStackSize);\n\t\t\t\t\tif (item == null || !item.MoveToContainer(newcontainer2, -1, allowStack: false, ignoreStackLimit: false, sourcePlayer, allowSwap: false))\n\t\t\t\t\t{\n\t\t\t\t\t\tslot2.amount += item.amount;\n\t\t\t\t\t\titem.MigrateItemOwnership(slot2, item.amount);\n\t\t\t\t\t\titem.Remove();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tBaseEntity entityOwner = GetEntityOwner();\n\t\t\t\tBaseEntity entityOwner2 = slot2.GetEntityOwner();\n\t\t\t\tRemoveFromContainer();\n\t\t\t\tslot2.RemoveFromContainer();\n\t\t\t\tRemoveConflictingSlots(newcontainer, entityOwner, sourcePlayer);\n\t\t\t\tslot2.RemoveConflictingSlots(itemContainer2, entityOwner2, sourcePlayer);\n\t\t\t\tif (!slot2.MoveToContainer(itemContainer2, iTargetPos2, allowStack: true, ignoreStackLimit: false, sourcePlayer) || !MoveToContainer(newcontainer, iTargetPos, allowStack: true, ignoreStackLimit: false, sourcePlayer))\n\t\t\t\t{\n\t\t\t\t\tRemoveFromContainer();\n\t\t\t\t\tslot2.RemoveFromContainer();\n\t\t\t\t\tSetParent(itemContainer2);\n\t\t\t\t\tposition = iTargetPos2;\n\t\t\t\t\tslot2.SetParent(newcontainer2);\n\t\t\t\t\tslot2.position = num3;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (parent == newcontainer)\n\t\t{\n\t\t\tif (iTargetPos >= 0 && iTargetPos != position && !parent.SlotTaken(this, iTargetPos))\n\t\t\t{\n\t\t\t\tnewcontainer.onItemPositionChanged?.Invoke(this, position, iTargetPos);\n\t\t\t\tposition = iTargetPos;\n\t\t\t\tMarkDirty();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (newcontainer.maxStackSize > 0 && newcontainer.maxStackSize < amount)\n\t\t{\n\t\t\tItem item2 = SplitItem(newcontainer.maxStackSize);\n\t\t\tif (item2 != null && !item2.MoveToContainer(newcontainer, iTargetPos, allowStack: false, ignoreStackLimit: false, sourcePlayer) && (itemContainer == null || !item2.MoveToContainer(itemContainer, -1, allowStack: true, ignoreStackLimit: false, sourcePlayer)))\n\t\t\t{\n\t\t\t\tDroppedItem droppedItem = item2.Drop(newcontainer.dropPosition, newcontainer.dropVelocity) as DroppedItem;\n\t\t\t\tif (droppedItem != null)\n\t\t\t\t{\n\t\t\t\t\tdroppedItem.DroppedBy = sourcePlayer?.userID ?? ((EncryptedValue<ulong>)0uL);\n\t\t\t\t}\n\t\t\t}\n\t\t\tOxide.Core.Interface.CallHook(\"OnItemStacked\", item2, this, newcontainer);\n\t\t\treturn true;\n\t\t}\n\t\tif (!newcontainer.CanAccept(this))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBaseEntity entityOwner3 = GetEntityOwner();\n\t\tRemoveFromContainer();\n\t\tRemoveFromWorld();\n\t\tRemoveConflictingSlots(newcontainer, entityOwner3, sourcePlayer);\n\t\tposition = iTargetPos;\n\t\tSetParent(newcontainer);\n\t\treturn true;\n\t}\n}\n",
      "ParametersText": "Item local13, Item item, ItemContainer newcontainer, int local15",
      "TargetName": "Item",
      "MethodName": "MoveToContainer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 746311991,
      "Name": "OnItemStacked",
      "FullName": "OnItemStacked [2]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local23",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "newcontainer",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is stacked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool MoveToContainer(ItemContainer newcontainer, int iTargetPos = -1, bool allowStack = true, bool ignoreStackLimit = false, BasePlayer sourcePlayer = null, bool allowSwap = true)\n{\n\tusing (TimeWarning.New(\"MoveToContainer\"))\n\t{\n\t\tBasePlayer playerOwner = newcontainer.playerOwner;\n\t\tif (playerOwner != null && playerOwner.IsDead() && parent != null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tbool flag = iTargetPos == -1;\n\t\tItemContainer itemContainer = parent;\n\t\tif (iTargetPos == -1)\n\t\t{\n\t\t\tif (allowStack && info.stackable > 1)\n\t\t\t{\n\t\t\t\tBufferList<Item> obj = Facepunch.Pool.Get<BufferList<Item>>();\n\t\t\t\tnewcontainer.FindItemsByItemID(info.itemid, obj);\n\t\t\t\tforeach (Item item3 in obj)\n\t\t\t\t{\n\t\t\t\t\tif (item3.position > iTargetPos && item3.CanStack(this) && (ignoreStackLimit || item3.amount < item3.MaxStackable()))\n\t\t\t\t\t{\n\t\t\t\t\t\tiTargetPos = item3.position;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.Free(ref obj, freeElements: false);\n\t\t\t}\n\t\t\tif (iTargetPos == -1 && newcontainer.GetEntityOwner(returnHeldEntity: true) is IIdealSlotEntity idealSlotEntity)\n\t\t\t{\n\t\t\t\tiTargetPos = idealSlotEntity.GetIdealSlot(sourcePlayer, newcontainer, this);\n\t\t\t\tif (iTargetPos == int.MinValue)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (iTargetPos == -1)\n\t\t\t{\n\t\t\t\tif (newcontainer == parent)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tbool flag2 = newcontainer.HasFlag(ItemContainer.Flag.Clothing) && info.isWearable;\n\t\t\t\tItemModWearable itemModWearable = info.ItemModWearable;\n\t\t\t\tfor (int i = 0; i < newcontainer.capacity; i++)\n\t\t\t\t{\n\t\t\t\t\tItem slot = newcontainer.GetSlot(i);\n\t\t\t\t\tif (slot == null)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (CanMoveTo(newcontainer, i))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tiTargetPos = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (flag2 && slot != null && !slot.info.ItemModWearable.CanExistWith(itemModWearable))\n\t\t\t\t\t{\n\t\t\t\t\t\tiTargetPos = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (newcontainer.HasAvailableSlotsDefined && DoItemSlotsConflict(slot))\n\t\t\t\t\t{\n\t\t\t\t\t\tiTargetPos = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (flag2 && iTargetPos == -1)\n\t\t\t\t{\n\t\t\t\t\tiTargetPos = newcontainer.capacity - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (iTargetPos == -1)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (!CanMoveTo(newcontainer, iTargetPos))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (iTargetPos >= 0 && newcontainer.SlotTaken(this, iTargetPos))\n\t\t{\n\t\t\tItem slot2 = newcontainer.GetSlot(iTargetPos);\n\t\t\tif (slot2 == this)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (allowStack && slot2 != null)\n\t\t\t{\n\t\t\t\tint num = slot2.MaxStackable();\n\t\t\t\tif (slot2.CanStack(this))\n\t\t\t\t{\n\t\t\t\t\tif (ignoreStackLimit)\n\t\t\t\t\t{\n\t\t\t\t\t\tnum = int.MaxValue;\n\t\t\t\t\t}\n\t\t\t\t\tif (slot2.amount >= num)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tint num2 = UnityEngine.Mathf.Min(num - slot2.amount, amount);\n\t\t\t\t\tslot2.amount += num2;\n\t\t\t\t\tif (slot2.instanceData != null && instanceData != null && (bool)info.GetComponent<ItemModFoodSpoiling>())\n\t\t\t\t\t{\n\t\t\t\t\t\tslot2.instanceData.dataFloat = UnityEngine.Mathf.Min(slot2.instanceData.dataFloat, instanceData.dataFloat);\n\t\t\t\t\t}\n\t\t\t\t\tnewcontainer.onItemAddedToStack?.Invoke(slot2, num2);\n\t\t\t\t\tamount -= num2;\n\t\t\t\t\tslot2.MarkDirty();\n\t\t\t\t\tOxide.Core.Interface.CallHook(\"OnItemStacked\", slot2, this, newcontainer, num2);\n\t\t\t\t\tMarkDirty();\n\t\t\t\t\tMigrateItemOwnership(slot2, num2);\n\t\t\t\t\tif (amount <= 0)\n\t\t\t\t\t{\n\t\t\t\t\t\tRemoveFromWorld();\n\t\t\t\t\t\tRemoveFromContainer();\n\t\t\t\t\t\tRemove();\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (flag)\n\t\t\t\t\t{\n\t\t\t\t\t\treturn MoveToContainer(newcontainer, -1, allowStack, ignoreStackLimit, sourcePlayer);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (parent != null && allowSwap && slot2 != null)\n\t\t\t{\n\t\t\t\tItemContainer itemContainer2 = parent;\n\t\t\t\tint iTargetPos2 = position;\n\t\t\t\tItemContainer newcontainer2 = slot2.parent;\n\t\t\t\tint num3 = slot2.position;\n\t\t\t\tif (!slot2.CanMoveTo(itemContainer2, iTargetPos2))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (itemContainer2.maxStackSize > 0 && slot2.amount > itemContainer2.maxStackSize)\n\t\t\t\t{\n\t\t\t\t\tItem item = slot2.SplitItem(slot2.amount - itemContainer2.maxStackSize);\n\t\t\t\t\tif (item == null || !item.MoveToContainer(newcontainer2, -1, allowStack: false, ignoreStackLimit: false, sourcePlayer, allowSwap: false))\n\t\t\t\t\t{\n\t\t\t\t\t\tslot2.amount += item.amount;\n\t\t\t\t\t\titem.MigrateItemOwnership(slot2, item.amount);\n\t\t\t\t\t\titem.Remove();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tBaseEntity entityOwner = GetEntityOwner();\n\t\t\t\tBaseEntity entityOwner2 = slot2.GetEntityOwner();\n\t\t\t\tRemoveFromContainer();\n\t\t\t\tslot2.RemoveFromContainer();\n\t\t\t\tRemoveConflictingSlots(newcontainer, entityOwner, sourcePlayer);\n\t\t\t\tslot2.RemoveConflictingSlots(itemContainer2, entityOwner2, sourcePlayer);\n\t\t\t\tif (!slot2.MoveToContainer(itemContainer2, iTargetPos2, allowStack: true, ignoreStackLimit: false, sourcePlayer) || !MoveToContainer(newcontainer, iTargetPos, allowStack: true, ignoreStackLimit: false, sourcePlayer))\n\t\t\t\t{\n\t\t\t\t\tRemoveFromContainer();\n\t\t\t\t\tslot2.RemoveFromContainer();\n\t\t\t\t\tSetParent(itemContainer2);\n\t\t\t\t\tposition = iTargetPos2;\n\t\t\t\t\tslot2.SetParent(newcontainer2);\n\t\t\t\t\tslot2.position = num3;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (parent == newcontainer)\n\t\t{\n\t\t\tif (iTargetPos >= 0 && iTargetPos != position && !parent.SlotTaken(this, iTargetPos))\n\t\t\t{\n\t\t\t\tnewcontainer.onItemPositionChanged?.Invoke(this, position, iTargetPos);\n\t\t\t\tposition = iTargetPos;\n\t\t\t\tMarkDirty();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (newcontainer.maxStackSize > 0 && newcontainer.maxStackSize < amount)\n\t\t{\n\t\t\tItem item2 = SplitItem(newcontainer.maxStackSize);\n\t\t\tif (item2 != null && !item2.MoveToContainer(newcontainer, iTargetPos, allowStack: false, ignoreStackLimit: false, sourcePlayer) && (itemContainer == null || !item2.MoveToContainer(itemContainer, -1, allowStack: true, ignoreStackLimit: false, sourcePlayer)))\n\t\t\t{\n\t\t\t\tDroppedItem droppedItem = item2.Drop(newcontainer.dropPosition, newcontainer.dropVelocity) as DroppedItem;\n\t\t\t\tif (droppedItem != null)\n\t\t\t\t{\n\t\t\t\t\tdroppedItem.DroppedBy = sourcePlayer?.userID ?? ((EncryptedValue<ulong>)0uL);\n\t\t\t\t}\n\t\t\t}\n\t\t\tOxide.Core.Interface.CallHook(\"OnItemStacked\", item2, this, newcontainer);\n\t\t\treturn true;\n\t\t}\n\t\tif (!newcontainer.CanAccept(this))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tBaseEntity entityOwner3 = GetEntityOwner();\n\t\tRemoveFromContainer();\n\t\tRemoveFromWorld();\n\t\tRemoveConflictingSlots(newcontainer, entityOwner3, sourcePlayer);\n\t\tposition = iTargetPos;\n\t\tSetParent(newcontainer);\n\t\treturn true;\n\t}\n}\n",
      "ParametersText": "Item local23, Item item, ItemContainer newcontainer",
      "TargetName": "Item",
      "MethodName": "MoveToContainer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1177078560,
      "Name": "OnItemLock",
      "FullName": "OnItemLock",
      "Category": "Item",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is locked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void LockUnlock(bool bNewState)\n{\n\tif (HasFlag(Item.Flag.IsLocked) != bNewState && (!bNewState || Oxide.Core.Interface.CallHook(\"OnItemLock\", this) == null) && (bNewState || Oxide.Core.Interface.CallHook(\"OnItemUnlock\", this) == null))\n\t{\n\t\tSetFlag(Item.Flag.IsLocked, bNewState);\n\t\tMarkDirty();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Item",
      "MethodName": "LockUnlock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 589368868,
      "Name": "OnItemUnlock",
      "FullName": "OnItemUnlock",
      "Category": "Item",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is unlocked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void LockUnlock(bool bNewState)\n{\n\tif (HasFlag(Item.Flag.IsLocked) != bNewState && (!bNewState || Oxide.Core.Interface.CallHook(\"OnItemLock\", this) == null) && (bNewState || Oxide.Core.Interface.CallHook(\"OnItemUnlock\", this) == null))\n\t{\n\t\tSetFlag(Item.Flag.IsLocked, bNewState);\n\t\tMarkDirty();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Item",
      "MethodName": "LockUnlock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2732072613,
      "Name": "OnHealingItemUse",
      "FullName": "OnHealingItemUse",
      "Category": "Item",
      "Parameters": [
        {
          "name": "medicalTool",
          "typeName": "MedicalTool",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a healing item uses."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void GiveEffectsTo(BasePlayer fromPlayer, IMedicalToolTarget toTarget)\n{\n\tif (fromPlayer == null || toTarget.GetEntity() == null)\n\t{\n\t\treturn;\n\t}\n\tItemDefinition ownerItemDefinition = GetOwnerItemDefinition();\n\tif (!(ownerItemDefinition == null))\n\t{\n\t\tItemModConsumable component = ownerItemDefinition.GetComponent<ItemModConsumable>();\n\t\tif (component == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogWarning(\"No consumable for medicaltool: \" + base.name);\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnHealingItemUse\", this, fromPlayer, toTarget) == null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnMedUsed(ownerItemDefinition.shortname, fromPlayer, toTarget.GetEntity());\n\t\t\ttoTarget.OnMedicalToolApplied(fromPlayer, ownerItemDefinition, component, this, canRevive);\n\t\t}\n\t}\n}\n",
      "ParametersText": "MedicalTool medicalTool",
      "TargetName": "MedicalTool",
      "MethodName": "GiveEffectsTo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3312631145,
      "Name": "OnItemResearch",
      "FullName": "OnItemResearch",
      "Category": "Item",
      "Parameters": [
        {
          "name": "researchTable",
          "typeName": "ResearchTable",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is researched."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void DoResearch(BaseEntity.RPCMessage msg)\n{\n\tif (IsResearching())\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tItem targetItem = GetTargetItem();\n\tif (targetItem != null && Oxide.Core.Interface.CallHook(\"CanResearchItem\", player, targetItem) == null && targetItem.amount <= 1 && IsItemResearchable(targetItem))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnItemResearch\", this, targetItem, player);\n\t\ttargetItem.CollectedForCrafting(player);\n\t\tresearchFinishedTime = UnityEngine.Time.realtimeSinceStartup + researchDuration;\n\t\tInvoke(ResearchAttemptFinished, researchDuration);\n\t\tbase.inventory.SetLocked(isLocked: true);\n\t\tint scrapCost = ScrapForResearch(targetItem);\n\t\tFacepunch.Rust.Analytics.Azure.OnResearchStarted(player, this, targetItem, scrapCost);\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tSendNetworkUpdate();\n\t\tplayer.inventory.loot.SendImmediate();\n\t\tif (researchStartEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(researchStartEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t\tmsg.player.GiveAchievement(\"RESEARCH_ITEM\");\n\t}\n}\n",
      "ParametersText": "ResearchTable researchTable, Item local1, BasePlayer local0",
      "TargetName": "ResearchTable",
      "MethodName": "DoResearch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2094586654,
      "Name": "OnItemResearched",
      "FullName": "OnItemResearched",
      "Category": "Item",
      "Parameters": [
        {
          "name": "researchTable",
          "typeName": "ResearchTable",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is researched."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ResearchAttemptFinished()\n{\n\tItem targetItem = GetTargetItem();\n\tItem scrapItem = GetScrapItem();\n\tif (targetItem != null && scrapItem != null)\n\t{\n\t\tint num = ScrapForResearch(targetItem);\n\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemResearched\", this, num);\n\t\tif (obj is int)\n\t\t{\n\t\t\tnum = (int)obj;\n\t\t}\n\t\tif (scrapItem.amount >= num)\n\t\t{\n\t\t\tif (scrapItem.amount == num)\n\t\t\t{\n\t\t\t\tbase.inventory.Remove(scrapItem);\n\t\t\t\tscrapItem.RemoveFromContainer();\n\t\t\t\tscrapItem.Remove();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tscrapItem.UseItem(num);\n\t\t\t}\n\t\t\tbase.inventory.Remove(targetItem);\n\t\t\ttargetItem.Remove();\n\t\t\tItem item = ItemManager.Create(ItemManager.blueprintBaseDef, 1, 0uL);\n\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t{\n\t\t\t\titem.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.ResearchTable);\n\t\t\t}\n\t\t\titem.blueprintTarget = ((targetItem.info.isRedirectOf != null) ? targetItem.info.isRedirectOf.itemid : targetItem.info.itemid);\n\t\t\tif (!item.MoveToContainer(base.inventory, 0))\n\t\t\t{\n\t\t\t\titem.Drop(GetDropPosition(), GetDropVelocity());\n\t\t\t}\n\t\t\tif (researchSuccessEffect.isValid)\n\t\t\t{\n\t\t\t\tEffect.server.Run(researchSuccessEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t\t}\n\t\t}\n\t}\n\tSendNetworkUpdateImmediate();\n\tif (user != null)\n\t{\n\t\tuser.inventory.loot.SendImmediate();\n\t}\n\tEndResearch();\n}\n",
      "ParametersText": "ResearchTable researchTable, int local2",
      "TargetName": "ResearchTable",
      "MethodName": "ResearchAttemptFinished",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3044147384,
      "Name": "OnResearchCostDetermine",
      "FullName": "OnResearchCostDetermine [Item]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when research cost determine occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static int ScrapForResearch(Item item)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnResearchCostDetermine\", item);\n\tif (obj is int)\n\t{\n\t\treturn (int)obj;\n\t}\n\treturn ScrapForResearch(item.info);\n}\n",
      "ParametersText": "Item item",
      "TargetName": "ResearchTable",
      "MethodName": "ScrapForResearch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    },
    {
      "Id": 3044147384,
      "Name": "OnResearchCostDetermine",
      "FullName": "OnResearchCostDetermine [ItemDef]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "info",
          "typeName": "ItemDefinition",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when research cost determine occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static int ScrapForResearch(Item item)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnResearchCostDetermine\", item);\n\tif (obj is int)\n\t{\n\t\treturn (int)obj;\n\t}\n\treturn ScrapForResearch(item.info);\n}\n",
      "ParametersText": "ItemDefinition info",
      "TargetName": "ResearchTable",
      "MethodName": "ScrapForResearch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    },
    {
      "Id": 768721788,
      "Name": "OnItemRepair",
      "FullName": "OnItemRepair",
      "Category": "Item",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "itemToRepair",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is repaired."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RepairAnItem(Item itemToRepair, BasePlayer player, BaseEntity repairBenchEntity, float maxConditionLostOnRepair, bool mustKnowBlueprint)\n{\n\tif (itemToRepair == null)\n\t{\n\t\treturn;\n\t}\n\tItemDefinition info = itemToRepair.info;\n\tItemBlueprint blueprint = info.Blueprint;\n\tif (!blueprint)\n\t{\n\t\treturn;\n\t}\n\tItemModRepair component = itemToRepair.info.GetComponent<ItemModRepair>();\n\tif (!info.condition.repairable || itemToRepair.condition == itemToRepair.maxCondition)\n\t{\n\t\treturn;\n\t}\n\tif (mustKnowBlueprint)\n\t{\n\t\tItemDefinition itemDefinition = ((info.isRedirectOf != null) ? info.isRedirectOf : info);\n\t\tbool flag = player.blueprints.HasUnlocked(itemDefinition) || (itemDefinition.Blueprint != null && !itemDefinition.Blueprint.isResearchable);\n\t\tif (!flag && BaseGameMode.svActiveGameMode != null && BaseGameMode.svActiveGameMode.canRepairIfCraftingBanned && !itemDefinition.IsAllowed(Rust.EraRestriction.Craft))\n\t\t{\n\t\t\tflag = true;\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnItemRepair\", player, itemToRepair) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = RepairCostFraction(itemToRepair);\n\tbool flag2 = false;\n\tSystem.Collections.Generic.List<ItemAmount> obj = Facepunch.Pool.Get<System.Collections.Generic.List<ItemAmount>>();\n\tGetRepairCostList(blueprint, obj);\n\tforeach (ItemAmount item in obj)\n\t{\n\t\tif (item.itemDef.category != ItemCategory.Component)\n\t\t{\n\t\t\tint amount = player.inventory.GetAmount(item.itemDef.itemid);\n\t\t\tif (UnityEngine.Mathf.CeilToInt(item.amount * num) > amount)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (flag2)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\treturn;\n\t}\n\tforeach (ItemAmount item2 in obj)\n\t{\n\t\tif (item2.itemDef.category != ItemCategory.Component)\n\t\t{\n\t\t\tint amount2 = UnityEngine.Mathf.CeilToInt(item2.amount * num);\n\t\t\tplayer.inventory.Take(null, item2.itemid, amount2);\n\t\t\tFacepunch.Rust.Analytics.Azure.LogResource(Facepunch.Rust.Analytics.Azure.ResourceMode.Consumed, \"repair\", item2.itemDef.shortname, amount2, repairBenchEntity, null, safezone: false, null, 0uL, null, itemToRepair, null, 0uL);\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\tfloat conditionNormalized = itemToRepair.conditionNormalized;\n\tfloat maxConditionNormalized = itemToRepair.maxConditionNormalized;\n\titemToRepair.DoRepair(maxConditionLostOnRepair);\n\tFacepunch.Rust.Analytics.Azure.OnItemRepaired(player, repairBenchEntity, itemToRepair, conditionNormalized, maxConditionNormalized);\n\tif (ConVar.Global.developer > 0)\n\t{\n\t\tUnityEngine.Debug.Log(\"Item repaired! condition : \" + itemToRepair.condition + \"/\" + itemToRepair.maxCondition);\n\t}\n\tstring strName = \"assets/bundled/prefabs/fx/repairbench/itemrepair.prefab\";\n\tif (component != null && component.successEffect?.Get() != null)\n\t{\n\t\tstrName = component.successEffect.resourcePath;\n\t}\n\tEffect.server.Run(strName, repairBenchEntity, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n}\n",
      "ParametersText": "BasePlayer player, Item itemToRepair",
      "TargetName": "RepairBench",
      "MethodName": "RepairAnItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4093960919,
      "Name": "OnItemSkinChange",
      "FullName": "OnItemSkinChange",
      "Category": "Item",
      "Parameters": [
        {
          "name": "inventoryId",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "repairBench",
          "typeName": "RepairBench",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item skin is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void ChangeSkin(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tint inventoryId = msg.read.Int32();\n\tItemId itemId = ((msg.read.Unread > 0) ? new ItemId(msg.read.UInt64()) : default(ItemId));\n\tbool isValid = itemId.IsValid;\n\tbool flag = !isValid || UnityEngine.Time.realtimeSinceStartup > nextSkinChangeAudioTime;\n\tItem slot = base.inventory.GetSlot(0);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnItemSkinChange\", inventoryId, slot, this, player) != null || (isValid && slot.uid != itemId))\n\t{\n\t\treturn;\n\t}\n\tif (inventoryId != 0 && !player.blueprints.CheckSkinOwnership(inventoryId, player))\n\t{\n\t\tdebugprint(\"RepairBench.ChangeSkin player does not have item :\" + inventoryId + \":\");\n\t\treturn;\n\t}\n\tulong Skin = ItemDefinition.FindSkin(slot.info.itemid, inventoryId);\n\tif (Skin == slot.skin && slot.info.isRedirectOf == null)\n\t{\n\t\tdebugprint(\"RepairBench.ChangeSkin cannot apply same skin twice : \" + Skin + \": \" + slot.skin);\n\t\treturn;\n\t}\n\tItemSkinDirectory.Skin skin = System.Linq.Enumerable.FirstOrDefault(slot.info.skins, (ItemSkinDirectory.Skin x) => (ulong)x.id == Skin);\n\tItemDefinition itemDefinition = slot.info;\n\tint num = 0;\n\tif (slot.info.isRedirectOf != null)\n\t{\n\t\tSkin = ItemDefinition.FindSkin(slot.info.isRedirectOf.itemid, inventoryId);\n\t\tskin = System.Linq.Enumerable.FirstOrDefault(slot.info.isRedirectOf.skins, (ItemSkinDirectory.Skin x) => (ulong)x.id == Skin);\n\t\tif (skin.invItem == null)\n\t\t{\n\t\t\tif (System.Linq.Enumerable.FirstOrDefault(slot.info.isRedirectOf.skins2, (IPlayerItemDefinition x) => x.DefinitionId == inventoryId) != null)\n\t\t\t{\n\t\t\t\titemDefinition = slot.info.isRedirectOf;\n\t\t\t\tnum = inventoryId;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\titemDefinition = slot.info.isRedirectOf;\n\t\t\t\tnum = 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnum = skin.invItem.id;\n\t\t\tif (skin.invItem is ItemSkin itemSkin)\n\t\t\t{\n\t\t\t\tif (itemSkin.Redirect != null)\n\t\t\t\t{\n\t\t\t\t\titemDefinition = itemSkin.Redirect;\n\t\t\t\t\tnum = 0;\n\t\t\t\t}\n\t\t\t\telse if (itemSkin.Redirect == null && slot.info.isRedirectOf != null)\n\t\t\t\t{\n\t\t\t\t\titemDefinition = slot.info.isRedirectOf;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (System.Linq.Enumerable.FirstOrDefault(slot.info.skins, (ItemSkinDirectory.Skin x) => (ulong)x.id == Skin).invItem is ItemSkin itemSkin2 && itemSkin2.Redirect != null)\n\t{\n\t\titemDefinition = itemSkin2.Redirect;\n\t}\n\tif (itemDefinition == slot.info && itemDefinition.isRedirectOf != null && num == 0)\n\t{\n\t\treturn;\n\t}\n\tif (flag)\n\t{\n\t\tnextSkinChangeAudioTime = UnityEngine.Time.realtimeSinceStartup + 0.75f;\n\t}\n\tif (itemDefinition != slot.info)\n\t{\n\t\tbool flag2 = false;\n\t\tflag2 = num != 0;\n\t\tfloat condition = slot.condition;\n\t\tfloat maxCondition = slot.maxCondition;\n\t\tint amount = slot.amount;\n\t\tint num2 = 0;\n\t\tint num3 = 0;\n\t\tItemModContainerArmorSlot component = slot.info.GetComponent<ItemModContainerArmorSlot>();\n\t\tif (component != null && slot.contents != null)\n\t\t{\n\t\t\tnum3 = slot.contents.capacity;\n\t\t}\n\t\tItemDefinition ammoType = null;\n\t\tif (slot.GetHeldEntity() != null && slot.GetHeldEntity() is BaseProjectile { primaryMagazine: not null } baseProjectile)\n\t\t{\n\t\t\tnum2 = baseProjectile.primaryMagazine.contents;\n\t\t\tammoType = baseProjectile.primaryMagazine.ammoType;\n\t\t}\n\t\tif (slot.GetHeldEntity() != null && slot.GetHeldEntity() is Chainsaw chainsaw)\n\t\t{\n\t\t\tnum2 = chainsaw.ammo;\n\t\t}\n\t\tSystem.Collections.Generic.List<Item> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Item>>();\n\t\tif (slot.contents != null && slot.contents.itemList != null && slot.contents.itemList.Count > 0)\n\t\t{\n\t\t\tif (slot.contents.itemList.Count > obj.Capacity)\n\t\t\t{\n\t\t\t\tobj.Capacity = slot.contents.itemList.Count;\n\t\t\t}\n\t\t\tforeach (Item item2 in slot.contents.itemList)\n\t\t\t{\n\t\t\t\tobj.Add(item2);\n\t\t\t}\n\t\t\tforeach (Item item3 in obj)\n\t\t\t{\n\t\t\t\titem3.RemoveFromContainer();\n\t\t\t}\n\t\t}\n\t\tItem item = ItemManager.Create(itemDefinition, 1, 0uL);\n\t\titem.ownershipShares = slot.ownershipShares;\n\t\tslot.ownershipShares = null;\n\t\tslot.Remove();\n\t\tItemManager.DoRemoves();\n\t\titem.MoveToContainer(base.inventory, 0, allowStack: false);\n\t\titem.maxCondition = maxCondition;\n\t\titem.condition = condition;\n\t\titem.amount = amount;\n\t\tif (item.GetHeldEntity() != null && item.GetHeldEntity() is BaseProjectile baseProjectile2)\n\t\t{\n\t\t\tif (baseProjectile2.primaryMagazine != null)\n\t\t\t{\n\t\t\t\tbaseProjectile2.SetAmmoCount(num2);\n\t\t\t\tbaseProjectile2.primaryMagazine.ammoType = ammoType;\n\t\t\t}\n\t\t\tbaseProjectile2.ForceModsChanged();\n\t\t}\n\t\tif (item.GetHeldEntity() != null && item.GetHeldEntity() is Chainsaw chainsaw2)\n\t\t{\n\t\t\tchainsaw2.ammo = num2;\n\t\t}\n\t\tif (num3 > 0)\n\t\t{\n\t\t\tcomponent = item.info.GetComponent<ItemModContainerArmorSlot>();\n\t\t\tcomponent.CreateAtCapacity(num3, item);\n\t\t}\n\t\tif (obj.Count > 0 && item.contents != null)\n\t\t{\n\t\t\tif (component != null)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t\t{\n\t\t\t\t\tobj[i]?.MoveToContainer(item.contents, i, allowStack: false);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tforeach (Item item4 in obj)\n\t\t\t\t{\n\t\t\t\t\titem4.MoveToContainer(item.contents);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFacepunch.Pool.Free(ref obj, freeElements: false);\n\t\tif (flag2)\n\t\t{\n\t\t\tApplySkinToItem(item, Skin);\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnSkinChanged(player, this, item, Skin);\n\t}\n\telse\n\t{\n\t\tApplySkinToItem(slot, Skin);\n\t\tFacepunch.Rust.Analytics.Azure.OnSkinChanged(player, this, slot, Skin);\n\t}\n\tif (flag && skinchangeEffect.isValid)\n\t{\n\t\tEffect.server.Run(skinchangeEffect.resourcePath, this, 0u, new UnityEngine.Vector3(0f, 1.5f, 0f), UnityEngine.Vector3.zero);\n\t}\n}\n",
      "ParametersText": "int inventoryId, Item local5, RepairBench repairBench, BasePlayer local1",
      "TargetName": "RepairBench",
      "MethodName": "ChangeSkin",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 322168974,
      "Name": "OnMapImageUpdated",
      "FullName": "OnMapImageUpdated",
      "Category": "Item",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a map image is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\n[BaseEntity.RPC_Server]\npublic void ImageUpdate(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player == null)\n\t{\n\t\treturn;\n\t}\n\tbyte b = msg.read.UInt8();\n\tbyte b2 = msg.read.UInt8();\n\tuint num = msg.read.UInt32();\n\tif ((b == 0 && fogImages[b2] == num) || (b == 1 && paintImages[b2] == num))\n\t{\n\t\treturn;\n\t}\n\tuint num2 = (uint)(b * 1000 + b2);\n\tbyte[] array = msg.read.BytesWithSize();\n\tif (array != null)\n\t{\n\t\tFileStorage.server.RemoveEntityNum(net.ID, num2);\n\t\tuint num3 = FileStorage.server.Store(array, FileStorage.Type.png, net.ID, num2);\n\t\tif (b == 0)\n\t\t{\n\t\t\tfogImages[b2] = num3;\n\t\t}\n\t\tif (b == 1)\n\t\t{\n\t\t\tpaintImages[b2] = num3;\n\t\t}\n\t\tInvalidateNetworkCache();\n\t\tOxide.Core.Interface.CallHook(\"OnMapImageUpdated\");\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "MapEntity",
      "MethodName": "ImageUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3643324244,
      "Name": "OnItemUpgrade",
      "FullName": "OnItemUpgrade",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item upgrades."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ServerCommand(Item item, string command, BasePlayer player)\n{\n\tif (!(command == \"upgrade_item\") || item.amount < numForUpgrade)\n\t{\n\t\treturn;\n\t}\n\tif (UnityEngine.Random.Range(0f, 1f) <= upgradeSuccessChance)\n\t{\n\t\titem.UseItem(numForUpgrade);\n\t\tItem item2 = ItemManager.Create(upgradedItem, numUpgradedItem, 0uL);\n\t\tOxide.Core.Interface.CallHook(\"OnItemUpgrade\", item, item2, player);\n\t\titem2.SetItemOwnership(player, ItemOwnershipPhrases.UpgradeItem);\n\t\tif (!item2.MoveToContainer(player.inventory.containerMain))\n\t\t{\n\t\t\titem2.Drop(player.GetDropPosition(), player.GetDropVelocity());\n\t\t}\n\t\tif (successEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(successEffect.resourcePath, player.eyes.position);\n\t\t}\n\t}\n\telse\n\t{\n\t\titem.UseItem(numToLoseOnFail);\n\t\tif (failEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(failEffect.resourcePath, player.eyes.position);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item item, Item local0, BasePlayer player",
      "TargetName": "ItemModUpgrade",
      "MethodName": "ServerCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3471265898,
      "Name": "CanEquipItem",
      "FullName": "CanEquipItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to equip item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanEquipItem(Item item, int targetSlot)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanEquipItem\", this, item, targetSlot);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif ((item.info.flags & ItemDefinition.Flag.NotAllowedInBelt) != 0)\n\t{\n\t\treturn false;\n\t}\n\tif (base.baseEntity != null && base.baseEntity.IsRestrained)\n\t{\n\t\tHandcuffs restraintItem = base.baseEntity.Belt.GetRestraintItem();\n\t\tif (restraintItem != null && restraintItem.GetItem().position == targetSlot)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t}\n\tItemModContainerRestriction component = item.info.GetComponent<ItemModContainerRestriction>();\n\tif (component == null)\n\t{\n\t\treturn true;\n\t}\n\tBufferList<Item> obj2 = Facepunch.Pool.Get<BufferList<Item>>();\n\tobj2.CopyFrom(containerBelt.itemList);\n\tforeach (Item item2 in obj2)\n\t{\n\t\tif (item2 != item)\n\t\t{\n\t\t\tItemModContainerRestriction component2 = item2.info.GetComponent<ItemModContainerRestriction>();\n\t\t\tif (!(component2 == null) && !component.CanExistWith(component2) && !item2.MoveToContainer(containerMain))\n\t\t\t{\n\t\t\t\titem2.Drop(base.baseEntity.GetDropPosition(), base.baseEntity.GetDropVelocity());\n\t\t\t}\n\t\t}\n\t}\n\tFacepunch.Pool.Free(ref obj2, freeElements: false);\n\treturn true;\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "CanEquipItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 4048531747,
      "Name": "CanWearItem",
      "FullName": "CanWearItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to wear item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanWearItem(Item item, int targetSlot)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanWearItem\", this, item, targetSlot);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn CanWearItem(item, canAdjustClothing: true, targetSlot);\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "CanWearItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3403522973,
      "Name": "OnItemAction",
      "FullName": "OnItemAction",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local2",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item action occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\nprivate void ItemCmd(BaseEntity.RPCMessage msg)\n{\n\tif ((msg.player != null && msg.player.IsWounded()) || base.baseEntity.IsTransferring())\n\t{\n\t\treturn;\n\t}\n\tItemId id = msg.read.ItemID();\n\tstring text = msg.read.String();\n\tItem item = FindItemByUID(id);\n\tif (item == null || Oxide.Core.Interface.CallHook(\"OnItemAction\", item, text, msg.player) != null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity entityOwner = item.GetEntityOwner();\n\tif ((entityOwner != null && entityOwner == msg.player && msg.player.IsRestrainedOrSurrendering) || item.IsLocked() || (item.parent != null && item.parent.IsLocked()) || !CanMoveItemsFrom(item.GetEntityOwner(), item).allowed)\n\t{\n\t\treturn;\n\t}\n\tif (text == \"drop\")\n\t{\n\t\tint num = item.amount;\n\t\tif (msg.read.Unread >= 4)\n\t\t{\n\t\t\tnum = msg.read.Int32();\n\t\t}\n\t\tif (!msg.player.isMounted && !msg.player.HasParent() && !GamePhysics.LineOfSight(msg.player.transform.position, msg.player.eyes.position, 1218519041))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbase.baseEntity.stats.Add(\"item_drop\", 1, (Stats)5);\n\t\tif (num < item.amount)\n\t\t{\n\t\t\tItem item2 = item.SplitItem(num);\n\t\t\tItemContainer parent = item.parent;\n\t\t\tif (item2 != null)\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 dropVelocity = GetDropVelocity(msg);\n\t\t\t\tDroppedItem droppedItem = item2.Drop(base.baseEntity.GetDropPosition(), dropVelocity) as DroppedItem;\n\t\t\t\tif (droppedItem != null)\n\t\t\t\t{\n\t\t\t\t\tdroppedItem.DropReason = DroppedItem.DropReasonEnum.Player;\n\t\t\t\t\tdroppedItem.DroppedBy = base.baseEntity.userID;\n\t\t\t\t\tdroppedItem.DroppedTime = System.DateTime.UtcNow;\n\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnItemDropped(base.baseEntity, droppedItem, DroppedItem.DropReasonEnum.Player);\n\t\t\t\t}\n\t\t\t}\n\t\t\tparent?.onItemRemovedFromStack?.Invoke(item, num);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUnityEngine.Vector3 dropVelocity2 = GetDropVelocity(msg);\n\t\t\tItemContainer parent2 = item.parent;\n\t\t\tDroppedItem droppedItem2 = item.Drop(base.baseEntity.GetDropPosition(), dropVelocity2) as DroppedItem;\n\t\t\tif (droppedItem2 != null)\n\t\t\t{\n\t\t\t\tdroppedItem2.DropReason = DroppedItem.DropReasonEnum.Player;\n\t\t\t\tdroppedItem2.DroppedBy = base.baseEntity.userID;\n\t\t\t\tdroppedItem2.DroppedTime = System.DateTime.UtcNow;\n\t\t\t\tFacepunch.Rust.Analytics.Azure.OnItemDropped(base.baseEntity, droppedItem2, DroppedItem.DropReasonEnum.Player);\n\t\t\t}\n\t\t\tparent2?.onItemAddedRemoved?.Invoke(item, arg2: false);\n\t\t}\n\t\tbase.baseEntity.SignalBroadcast(BaseEntity.Signal.Gesture, \"drop_item\");\n\t}\n\telse\n\t{\n\t\titem.ServerCommand(text, base.baseEntity);\n\t\tItemManager.DoRemoves();\n\t\tServerUpdate(0f);\n\t}\n}\n",
      "ParametersText": "Item local2, string local1, BasePlayer player",
      "TargetName": "PlayerInventory",
      "MethodName": "ItemCmd",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3939984194,
      "Name": "CanMoveItem",
      "FullName": "CanMoveItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local5",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "ItemContainerId",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "ItemMoveModifier",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to move item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\npublic void MoveItem(BaseEntity.RPCMessage msg)\n{\n\tif (base.baseEntity.IsTransferring())\n\t{\n\t\treturn;\n\t}\n\tItemId id = msg.read.ItemID();\n\tItemContainerId itemContainerId = msg.read.ItemContainerID();\n\tint num = msg.read.Int8();\n\tint num2 = (int)msg.read.UInt32();\n\tItemMoveModifier itemMoveModifier = (ItemMoveModifier)msg.read.Int32();\n\tItem item = FindItemByUID(id);\n\tif (item == null)\n\t{\n\t\tmsg.player.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.InvalidItem, false);\n\t\tConstructionErrors.Log(msg.player, id.ToString());\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"CanMoveItem\", item, this, itemContainerId, num, num2, itemMoveModifier) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tBaseEntity entityOwner = item.GetEntityOwner();\n\t\tif (entityOwner != null && entityOwner == msg.player && msg.player.IsRestrainedOrSurrendering)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tPlayerInventory.CanMoveFromResponse canMoveFromResponse = CanMoveItemsFrom(entityOwner, item);\n\t\tif (!canMoveFromResponse.allowed)\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, canMoveFromResponse.reasonForFailure ?? PlayerInventoryErrors.CannotMoveItem, canMoveFromResponse.reasonForFailure != null);\n\t\t\treturn;\n\t\t}\n\t\tif (num2 <= 0)\n\t\t{\n\t\t\tnum2 = item.amount;\n\t\t}\n\t\tnum2 = UnityEngine.Mathf.Clamp(num2, 1, item.MaxStackable());\n\t\tif (msg.player.GetActiveItem() == item)\n\t\t{\n\t\t\tmsg.player.UpdateActiveItem(default(ItemId));\n\t\t}\n\t\tif (!itemContainerId.IsValid)\n\t\t{\n\t\t\tBaseEntity baseEntity = entityOwner;\n\t\t\tif (loot.containers.Count > 0)\n\t\t\t{\n\t\t\t\tif (entityOwner == base.baseEntity)\n\t\t\t\t{\n\t\t\t\t\tif ((itemMoveModifier & ItemMoveModifier.Alt) != ItemMoveModifier.Alt)\n\t\t\t\t\t{\n\t\t\t\t\t\tbaseEntity = loot.entitySource;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tbaseEntity = base.baseEntity;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (baseEntity is IIdealSlotEntity idealSlotEntity)\n\t\t\t{\n\t\t\t\titemContainerId = idealSlotEntity.GetIdealContainer(base.baseEntity, item, itemMoveModifier);\n\t\t\t\tif (itemContainerId == ItemContainerId.Invalid)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tItemContainer parent = item.parent;\n\t\t\tif (parent != null && parent.IsLocked())\n\t\t\t{\n\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.ContainerLocked, false);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!itemContainerId.IsValid)\n\t\t\t{\n\t\t\t\tif (baseEntity == loot.entitySource)\n\t\t\t\t{\n\t\t\t\t\tforeach (ItemContainer container in loot.containers)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (!container.PlayerItemInputBlocked() && !container.IsLocked() && item.MoveToContainer(container, -1, allowStack: true, ignoreStackLimit: false, base.baseEntity))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!GiveItem(item, itemMoveModifier))\n\t\t\t\t{\n\t\t\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.GiveItemFailedError, false);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tItemContainer itemContainer = FindContainer(itemContainerId);\n\t\tif (itemContainer == null)\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.InvalidContainer, false);\n\t\t\tConstructionErrors.Log(msg.player, itemContainerId.ToString());\n\t\t\treturn;\n\t\t}\n\t\tif (itemContainer.IsLocked())\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.ContainerLocked, false);\n\t\t\treturn;\n\t\t}\n\t\tif (itemContainer.PlayerItemInputBlocked())\n\t\t{\n\t\t\tmsg.player.ShowToast(GameTip.Styles.Error, PlayerInventoryErrors.DoesntAcceptPlayerItems, false);\n\t\t\treturn;\n\t\t}\n\t\tif (itemContainer.maxStackSize > 0)\n\t\t{\n\t\t\tnum2 = UnityEngine.Mathf.Clamp(num2, 1, itemContainer.maxStackSize);\n\t\t}\n\t\tbool allowSwap = !itemContainer.PlayerItemInputBlocked() && item.parent != null && !item.parent.PlayerItemInputBlocked();\n\t\tusing (TimeWarning.New(\"Split\"))\n\t\t{\n\t\t\tif (item.amount > num2)\n\t\t\t{\n\t\t\t\tint split_Amount = num2;\n\t\t\t\tItem item2 = item.SplitItem(split_Amount);\n\t\t\t\tItem slot = itemContainer.GetSlot(num);\n\t\t\t\tif (slot != null && !item.CanStack(slot) && item.parent != null && !item2.MoveToContainer(item.parent, -1, allowStack: false, ignoreStackLimit: false, base.baseEntity, allowSwap: false))\n\t\t\t\t{\n\t\t\t\t\titem.amount += item2.amount;\n\t\t\t\t\titem2.Remove();\n\t\t\t\t\tItemManager.DoRemoves();\n\t\t\t\t\tServerUpdate(0f);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!item2.MoveToContainer(itemContainer, num, allowStack: true, ignoreStackLimit: false, base.baseEntity, allowSwap))\n\t\t\t\t{\n\t\t\t\t\titem.amount += item2.amount;\n\t\t\t\t\titem2.Remove();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\titem.parent.onItemRemovedFromStack?.Invoke(item, num2);\n\t\t\t\t}\n\t\t\t\tItemManager.DoRemoves();\n\t\t\t\tServerUpdate(0f);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (item.MoveToContainer(itemContainer, num, allowStack: true, ignoreStackLimit: false, base.baseEntity, allowSwap))\n\t\t{\n\t\t\tItemManager.DoRemoves();\n\t\t\tServerUpdate(0f);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local5, PlayerInventory playerInventory, ItemContainerId local1, int local2, int local3, ItemMoveModifier local4",
      "TargetName": "PlayerInventory",
      "MethodName": "MoveItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1800965447,
      "Name": "OnInventoryItemsCount",
      "FullName": "OnInventoryItemsCount",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when inventory items count occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public int GetAmount(ItemDefinition definition)\n{\n\tif (!(definition != null))\n\t{\n\t\treturn 0;\n\t}\n\treturn GetAmount(definition.itemid);\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "GetAmount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    },
    {
      "Id": 565506075,
      "Name": "OnInventoryItemsTake",
      "FullName": "OnInventoryItemsTake",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when inventory items take occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public int Take(System.Collections.Generic.List<Item> collect, int itemid, int amount)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnInventoryItemsTake\", this, collect, itemid, amount);\n\tif (obj is int)\n\t{\n\t\treturn (int)obj;\n\t}\n\tint num = 0;\n\tif (containerMain != null)\n\t{\n\t\tint num2 = containerMain.Take(collect, itemid, amount);\n\t\tnum += num2;\n\t\tamount -= num2;\n\t}\n\tif (amount <= 0)\n\t{\n\t\treturn num;\n\t}\n\tif (containerBelt != null)\n\t{\n\t\tint num3 = containerBelt.Take(collect, itemid, amount);\n\t\tnum += num3;\n\t\tamount -= num3;\n\t}\n\tif (amount <= 0)\n\t{\n\t\treturn num;\n\t}\n\tif (containerWear != null)\n\t{\n\t\tint num4 = containerWear.Take(collect, itemid, amount);\n\t\tnum += num4;\n\t\tamount -= num4;\n\t}\n\treturn num;\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "Take",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "int"
    },
    {
      "Id": 3014194616,
      "Name": "OnInventoryItemsFind",
      "FullName": "OnInventoryItemsFind",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        },
        {
          "name": "id",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "list",
          "typeName": "System.Collections.Generic.List`1[Item]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory items is found."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FindItemsByItemID(System.Collections.Generic.List<Item> list, int id)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnInventoryItemsFind\", this, id, list) == null)\n\t{\n\t\tif (containerMain != null)\n\t\t{\n\t\t\tcontainerMain.FindItemsByItemID(list, id);\n\t\t}\n\t\tif (containerBelt != null)\n\t\t{\n\t\t\tcontainerBelt.FindItemsByItemID(list, id);\n\t\t}\n\t\tif (containerWear != null)\n\t\t{\n\t\t\tcontainerWear.FindItemsByItemID(list, id);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PlayerInventory playerInventory, int id, System.Collections.Generic.List`1[Item] list",
      "TargetName": "PlayerInventory",
      "MethodName": "FindItemsByItemID",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2374724162,
      "Name": "OnInventoryAmmoFind",
      "FullName": "OnInventoryAmmoFind",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory ammo is found."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item FindAmmo(Rust.AmmoTypes ammoType)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnInventoryAmmoItemFind\", this, ammoType);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\tItem item = containerMain?.FindAmmo(ammoType);\n\tif (item == null)\n\t{\n\t\titem = containerBelt?.FindAmmo(ammoType);\n\t}\n\treturn item;\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "FindAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1554715023,
      "Name": "OnBackpackDrop",
      "FullName": "OnBackpackDrop",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a backpack is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TryDropBackpack()\n{\n\tItem anyBackpack = GetAnyBackpack();\n\tif (anyBackpack != null && base.baseEntity.isServer && Oxide.Core.Interface.CallHook(\"OnBackpackDrop\", anyBackpack, this) == null)\n\t{\n\t\tanyBackpack.Drop(base.baseEntity.GetDropPosition(), base.baseEntity.GetDropVelocity());\n\t}\n}\n",
      "ParametersText": "Item local0, PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "TryDropBackpack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3087521756,
      "Name": "OnInventoryItemFind",
      "FullName": "OnInventoryItemFind",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory item is found."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item FindItemByItemID(string itemName)\n{\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(itemName);\n\tif (itemDefinition == null)\n\t{\n\t\treturn null;\n\t}\n\treturn FindItemByItemID(itemDefinition.itemid);\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "FindItemByItemID",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 3730208425,
      "Name": "OnInventoryAmmoItemFind",
      "FullName": "OnInventoryAmmoItemFind [PlayerInventory]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "playerInventory",
          "typeName": "PlayerInventory",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory ammo item is found."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item FindAmmo(Rust.AmmoTypes ammoType)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnInventoryAmmoItemFind\", this, ammoType);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\tItem item = containerMain?.FindAmmo(ammoType);\n\tif (item == null)\n\t{\n\t\titem = containerBelt?.FindAmmo(ammoType);\n\t}\n\treturn item;\n}\n",
      "ParametersText": "PlayerInventory playerInventory",
      "TargetName": "PlayerInventory",
      "MethodName": "FindAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 1833117670,
      "Name": "OnItemPickup",
      "FullName": "OnItemPickup",
      "Category": "Item",
      "Parameters": [
        {
          "name": "worldItem",
          "typeName": "WorldItem",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "WorldItem",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is picked up."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void Pickup(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player.CanInteract() && this.item != null && allowPickup && Oxide.Core.Interface.CallHook(\"OnItemPickup\", this.item, msg.player, this) == null && CanOpenInSafeZone(msg.player))\n\t{\n\t\tItemModContainer component = this.item.info.GetComponent<ItemModContainer>();\n\t\tif (!(component != null) || !component.canLootInWorld || !(component.pickupInWorldDelay > 0f) || !(UnityEngine.Mathf.Abs(pickupStartTime + component.pickupInWorldDelay - UnityEngine.Time.realtimeSinceStartup) > ConVar.AntiHack.rpc_timer_forgiveness))\n\t\t{\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"PickupSound\"));\n\t\t\tItem item = this.item;\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemPickup(msg.player, this);\n\t\t\tRemoveItem();\n\t\t\tTryApplyOwnershipOnPickup(msg.player, item);\n\t\t\tmsg.player.GiveItem(item, BaseEntity.GiveItemReason.PickedUp, GiveItemOptions.BackpackOverflow);\n\t\t\tmsg.player.SignalBroadcast(BaseEntity.Signal.Gesture, \"pickup_item\");\n\t\t}\n\t}\n}\n",
      "ParametersText": "WorldItem worldItem, BasePlayer player, WorldItem self1",
      "TargetName": "WorldItem",
      "MethodName": "Pickup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2432278859,
      "Name": "OnFindBurnable",
      "FullName": "OnFindBurnable",
      "Category": "Item",
      "Parameters": [
        {
          "name": "baseOven",
          "typeName": "BaseOven",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when find burnable occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item FindBurnable()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnFindBurnable\", this);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\tusing (TimeWarning.New(\"FindBurnable\"))\n\t{\n\t\tif (base.inventory == null)\n\t\t{\n\t\t\treturn null;\n\t\t}\n\t\tforeach (Item item in base.inventory.itemList)\n\t\t{\n\t\t\tif (IsBurnableItem(item))\n\t\t\t{\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n",
      "ParametersText": "BaseOven baseOven",
      "TargetName": "BaseOven",
      "MethodName": "FindBurnable",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 2718382832,
      "Name": "OnItemRecycle",
      "FullName": "OnItemRecycle",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local3",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "recycler",
          "typeName": "Recycler",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item recycles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RecycleThink()\n{\n\tbool flag = false;\n\tfloat num = (IsSafezoneRecycler() ? safezoneRecycleEfficiency : radtownRecycleEfficiency);\n\tint num2 = 0;\n\twhile (true)\n\t{\n\t\tif (num2 < 6)\n\t\t{\n\t\t\tItem slot = base.inventory.GetSlot(num2);\n\t\t\tif (!CanBeRecycled(slot))\n\t\t\t{\n\t\t\t\tnum2++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnItemRecycle\", slot, this) != null)\n\t\t\t{\n\t\t\t\tif (!HasRecyclable())\n\t\t\t\t{\n\t\t\t\t\tStopRecycling();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (slot.hasCondition)\n\t\t\t{\n\t\t\t\tnum = UnityEngine.Mathf.Clamp01(num * UnityEngine.Mathf.Clamp(slot.conditionNormalized * slot.maxConditionNormalized, 0.1f, 1f));\n\t\t\t}\n\t\t\tint num3 = 1;\n\t\t\tif (slot.amount > 1)\n\t\t\t{\n\t\t\t\tnum3 = UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Min(slot.amount, (float)slot.MaxStackable() * 0.1f));\n\t\t\t}\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemRecycleAmount\", slot, num3, this);\n\t\t\tif (obj is int)\n\t\t\t{\n\t\t\t\tnum3 = (int)obj;\n\t\t\t}\n\t\t\tif (slot.info.Blueprint.scrapFromRecycle > 0)\n\t\t\t{\n\t\t\t\tfloat num4 = slot.info.Blueprint.scrapFromRecycle * num3;\n\t\t\t\tif (slot.MaxStackable() == 1 && slot.hasCondition)\n\t\t\t\t{\n\t\t\t\t\tnum4 *= slot.conditionNormalized;\n\t\t\t\t}\n\t\t\t\tfloat num5 = num / 0.5f;\n\t\t\t\tnum4 *= num5;\n\t\t\t\tint num6 = UnityEngine.Mathf.FloorToInt(num4);\n\t\t\t\tfloat num7 = num4 - (float)num6;\n\t\t\t\tscrapRemainder += num7;\n\t\t\t\tif (scrapRemainder >= 1f)\n\t\t\t\t{\n\t\t\t\t\tint num8 = UnityEngine.Mathf.FloorToInt(scrapRemainder);\n\t\t\t\t\tscrapRemainder -= num8;\n\t\t\t\t\tnum6 += num8;\n\t\t\t\t}\n\t\t\t\tif (num6 >= 1)\n\t\t\t\t{\n\t\t\t\t\tItem item = ItemManager.CreateByName(\"scrap\", num6, 0uL);\n\t\t\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.Recycler);\n\t\t\t\t\t}\n\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnRecyclerItemProduced(item.info.shortname, item.amount, this, slot);\n\t\t\t\t\tMoveItemToOutput(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!string.IsNullOrEmpty(slot.info.Blueprint.RecycleStat))\n\t\t\t{\n\t\t\t\tSystem.Collections.Generic.List<BasePlayer> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<BasePlayer>>();\n\t\t\t\tVis.Entities(base.transform.position, 3f, obj2, 131072);\n\t\t\t\tforeach (BasePlayer item3 in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (item3.IsAlive() && !item3.IsSleeping() && item3.inventory.loot.entitySource == this)\n\t\t\t\t\t{\n\t\t\t\t\t\titem3.stats.Add(slot.info.Blueprint.RecycleStat, num3, (Stats)5);\n\t\t\t\t\t\titem3.stats.Save();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemRecycled(slot.info.shortname, num3, this);\n\t\t\tslot.UseItem(num3);\n\t\t\tforeach (ItemAmount ingredient in slot.info.Blueprint.GetIngredients())\n\t\t\t{\n\t\t\t\tif (ingredient.itemDef.shortname == \"scrap\")\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfloat num9 = ingredient.amount / (float)slot.info.Blueprint.amountToCreate * num * (float)num3;\n\t\t\t\tint num10 = UnityEngine.Mathf.FloorToInt(num9);\n\t\t\t\tfloat num11 = num9 - (float)num10;\n\t\t\t\tif (num11 > float.Epsilon && UnityEngine.Random.Range(0f, 1f) <= num11)\n\t\t\t\t{\n\t\t\t\t\tnum10++;\n\t\t\t\t}\n\t\t\t\tif (num10 <= 0)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num12 = UnityEngine.Mathf.CeilToInt((float)num10 / (float)ingredient.itemDef.stackable);\n\t\t\t\tfor (int i = 0; i < num12; i++)\n\t\t\t\t{\n\t\t\t\t\tif (ingredient.itemDef.IsAllowed(Rust.EraRestriction.Recycle))\n\t\t\t\t\t{\n\t\t\t\t\t\tint num13 = ((num10 > ingredient.itemDef.stackable) ? ingredient.itemDef.stackable : num10);\n\t\t\t\t\t\tItem item2 = ItemManager.Create(ingredient.itemDef, num13, 0uL);\n\t\t\t\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\titem2.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.Recycler);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnRecyclerItemProduced(item2.info.shortname, item2.amount, this, slot);\n\t\t\t\t\t\tif (!MoveItemToOutput(item2))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnum10 -= num13;\n\t\t\t\t\t\tif (num10 <= 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (flag || !HasRecyclable())\n\t\t{\n\t\t\tStopRecycling();\n\t\t}\n\t\tbreak;\n\t}\n}\n",
      "ParametersText": "Item local3, Recycler recycler",
      "TargetName": "Recycler",
      "MethodName": "RecycleThink",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3746186934,
      "Name": "OnItemRecycleAmount",
      "FullName": "OnItemRecycleAmount",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local3",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "recycler",
          "typeName": "Recycler",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item recycle amount occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RecycleThink()\n{\n\tbool flag = false;\n\tfloat num = (IsSafezoneRecycler() ? safezoneRecycleEfficiency : radtownRecycleEfficiency);\n\tint num2 = 0;\n\twhile (true)\n\t{\n\t\tif (num2 < 6)\n\t\t{\n\t\t\tItem slot = base.inventory.GetSlot(num2);\n\t\t\tif (!CanBeRecycled(slot))\n\t\t\t{\n\t\t\t\tnum2++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnItemRecycle\", slot, this) != null)\n\t\t\t{\n\t\t\t\tif (!HasRecyclable())\n\t\t\t\t{\n\t\t\t\t\tStopRecycling();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (slot.hasCondition)\n\t\t\t{\n\t\t\t\tnum = UnityEngine.Mathf.Clamp01(num * UnityEngine.Mathf.Clamp(slot.conditionNormalized * slot.maxConditionNormalized, 0.1f, 1f));\n\t\t\t}\n\t\t\tint num3 = 1;\n\t\t\tif (slot.amount > 1)\n\t\t\t{\n\t\t\t\tnum3 = UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Min(slot.amount, (float)slot.MaxStackable() * 0.1f));\n\t\t\t}\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemRecycleAmount\", slot, num3, this);\n\t\t\tif (obj is int)\n\t\t\t{\n\t\t\t\tnum3 = (int)obj;\n\t\t\t}\n\t\t\tif (slot.info.Blueprint.scrapFromRecycle > 0)\n\t\t\t{\n\t\t\t\tfloat num4 = slot.info.Blueprint.scrapFromRecycle * num3;\n\t\t\t\tif (slot.MaxStackable() == 1 && slot.hasCondition)\n\t\t\t\t{\n\t\t\t\t\tnum4 *= slot.conditionNormalized;\n\t\t\t\t}\n\t\t\t\tfloat num5 = num / 0.5f;\n\t\t\t\tnum4 *= num5;\n\t\t\t\tint num6 = UnityEngine.Mathf.FloorToInt(num4);\n\t\t\t\tfloat num7 = num4 - (float)num6;\n\t\t\t\tscrapRemainder += num7;\n\t\t\t\tif (scrapRemainder >= 1f)\n\t\t\t\t{\n\t\t\t\t\tint num8 = UnityEngine.Mathf.FloorToInt(scrapRemainder);\n\t\t\t\t\tscrapRemainder -= num8;\n\t\t\t\t\tnum6 += num8;\n\t\t\t\t}\n\t\t\t\tif (num6 >= 1)\n\t\t\t\t{\n\t\t\t\t\tItem item = ItemManager.CreateByName(\"scrap\", num6, 0uL);\n\t\t\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.Recycler);\n\t\t\t\t\t}\n\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnRecyclerItemProduced(item.info.shortname, item.amount, this, slot);\n\t\t\t\t\tMoveItemToOutput(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!string.IsNullOrEmpty(slot.info.Blueprint.RecycleStat))\n\t\t\t{\n\t\t\t\tSystem.Collections.Generic.List<BasePlayer> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<BasePlayer>>();\n\t\t\t\tVis.Entities(base.transform.position, 3f, obj2, 131072);\n\t\t\t\tforeach (BasePlayer item3 in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (item3.IsAlive() && !item3.IsSleeping() && item3.inventory.loot.entitySource == this)\n\t\t\t\t\t{\n\t\t\t\t\t\titem3.stats.Add(slot.info.Blueprint.RecycleStat, num3, (Stats)5);\n\t\t\t\t\t\titem3.stats.Save();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemRecycled(slot.info.shortname, num3, this);\n\t\t\tslot.UseItem(num3);\n\t\t\tforeach (ItemAmount ingredient in slot.info.Blueprint.GetIngredients())\n\t\t\t{\n\t\t\t\tif (ingredient.itemDef.shortname == \"scrap\")\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfloat num9 = ingredient.amount / (float)slot.info.Blueprint.amountToCreate * num * (float)num3;\n\t\t\t\tint num10 = UnityEngine.Mathf.FloorToInt(num9);\n\t\t\t\tfloat num11 = num9 - (float)num10;\n\t\t\t\tif (num11 > float.Epsilon && UnityEngine.Random.Range(0f, 1f) <= num11)\n\t\t\t\t{\n\t\t\t\t\tnum10++;\n\t\t\t\t}\n\t\t\t\tif (num10 <= 0)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num12 = UnityEngine.Mathf.CeilToInt((float)num10 / (float)ingredient.itemDef.stackable);\n\t\t\t\tfor (int i = 0; i < num12; i++)\n\t\t\t\t{\n\t\t\t\t\tif (ingredient.itemDef.IsAllowed(Rust.EraRestriction.Recycle))\n\t\t\t\t\t{\n\t\t\t\t\t\tint num13 = ((num10 > ingredient.itemDef.stackable) ? ingredient.itemDef.stackable : num10);\n\t\t\t\t\t\tItem item2 = ItemManager.Create(ingredient.itemDef, num13, 0uL);\n\t\t\t\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\titem2.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.Recycler);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnRecyclerItemProduced(item2.info.shortname, item2.amount, this, slot);\n\t\t\t\t\t\tif (!MoveItemToOutput(item2))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnum10 -= num13;\n\t\t\t\t\t\tif (num10 <= 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (flag || !HasRecyclable())\n\t\t{\n\t\t\tStopRecycling();\n\t\t}\n\t\tbreak;\n\t}\n}\n",
      "ParametersText": "Item local3, int local4, Recycler recycler",
      "TargetName": "Recycler",
      "MethodName": "RecycleThink",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2718382832,
      "Name": "OnItemRecycle",
      "FullName": "OnItemRecycle [2]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an item recycles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RecycleThink()\n{\n\tbool flag = false;\n\tfloat num = (IsSafezoneRecycler() ? safezoneRecycleEfficiency : radtownRecycleEfficiency);\n\tint num2 = 0;\n\twhile (true)\n\t{\n\t\tif (num2 < 6)\n\t\t{\n\t\t\tItem slot = base.inventory.GetSlot(num2);\n\t\t\tif (!CanBeRecycled(slot))\n\t\t\t{\n\t\t\t\tnum2++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnItemRecycle\", slot, this) != null)\n\t\t\t{\n\t\t\t\tif (!HasRecyclable())\n\t\t\t\t{\n\t\t\t\t\tStopRecycling();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (slot.hasCondition)\n\t\t\t{\n\t\t\t\tnum = UnityEngine.Mathf.Clamp01(num * UnityEngine.Mathf.Clamp(slot.conditionNormalized * slot.maxConditionNormalized, 0.1f, 1f));\n\t\t\t}\n\t\t\tint num3 = 1;\n\t\t\tif (slot.amount > 1)\n\t\t\t{\n\t\t\t\tnum3 = UnityEngine.Mathf.CeilToInt(UnityEngine.Mathf.Min(slot.amount, (float)slot.MaxStackable() * 0.1f));\n\t\t\t}\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemRecycleAmount\", slot, num3, this);\n\t\t\tif (obj is int)\n\t\t\t{\n\t\t\t\tnum3 = (int)obj;\n\t\t\t}\n\t\t\tif (slot.info.Blueprint.scrapFromRecycle > 0)\n\t\t\t{\n\t\t\t\tfloat num4 = slot.info.Blueprint.scrapFromRecycle * num3;\n\t\t\t\tif (slot.MaxStackable() == 1 && slot.hasCondition)\n\t\t\t\t{\n\t\t\t\t\tnum4 *= slot.conditionNormalized;\n\t\t\t\t}\n\t\t\t\tfloat num5 = num / 0.5f;\n\t\t\t\tnum4 *= num5;\n\t\t\t\tint num6 = UnityEngine.Mathf.FloorToInt(num4);\n\t\t\t\tfloat num7 = num4 - (float)num6;\n\t\t\t\tscrapRemainder += num7;\n\t\t\t\tif (scrapRemainder >= 1f)\n\t\t\t\t{\n\t\t\t\t\tint num8 = UnityEngine.Mathf.FloorToInt(scrapRemainder);\n\t\t\t\t\tscrapRemainder -= num8;\n\t\t\t\t\tnum6 += num8;\n\t\t\t\t}\n\t\t\t\tif (num6 >= 1)\n\t\t\t\t{\n\t\t\t\t\tItem item = ItemManager.CreateByName(\"scrap\", num6, 0uL);\n\t\t\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.Recycler);\n\t\t\t\t\t}\n\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnRecyclerItemProduced(item.info.shortname, item.amount, this, slot);\n\t\t\t\t\tMoveItemToOutput(item);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!string.IsNullOrEmpty(slot.info.Blueprint.RecycleStat))\n\t\t\t{\n\t\t\t\tSystem.Collections.Generic.List<BasePlayer> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<BasePlayer>>();\n\t\t\t\tVis.Entities(base.transform.position, 3f, obj2, 131072);\n\t\t\t\tforeach (BasePlayer item3 in obj2)\n\t\t\t\t{\n\t\t\t\t\tif (item3.IsAlive() && !item3.IsSleeping() && item3.inventory.loot.entitySource == this)\n\t\t\t\t\t{\n\t\t\t\t\t\titem3.stats.Add(slot.info.Blueprint.RecycleStat, num3, (Stats)5);\n\t\t\t\t\t\titem3.stats.Save();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnItemRecycled(slot.info.shortname, num3, this);\n\t\t\tslot.UseItem(num3);\n\t\t\tforeach (ItemAmount ingredient in slot.info.Blueprint.GetIngredients())\n\t\t\t{\n\t\t\t\tif (ingredient.itemDef.shortname == \"scrap\")\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tfloat num9 = ingredient.amount / (float)slot.info.Blueprint.amountToCreate * num * (float)num3;\n\t\t\t\tint num10 = UnityEngine.Mathf.FloorToInt(num9);\n\t\t\t\tfloat num11 = num9 - (float)num10;\n\t\t\t\tif (num11 > float.Epsilon && UnityEngine.Random.Range(0f, 1f) <= num11)\n\t\t\t\t{\n\t\t\t\t\tnum10++;\n\t\t\t\t}\n\t\t\t\tif (num10 <= 0)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tint num12 = UnityEngine.Mathf.CeilToInt((float)num10 / (float)ingredient.itemDef.stackable);\n\t\t\t\tfor (int i = 0; i < num12; i++)\n\t\t\t\t{\n\t\t\t\t\tif (ingredient.itemDef.IsAllowed(Rust.EraRestriction.Recycle))\n\t\t\t\t\t{\n\t\t\t\t\t\tint num13 = ((num10 > ingredient.itemDef.stackable) ? ingredient.itemDef.stackable : num10);\n\t\t\t\t\t\tItem item2 = ItemManager.Create(ingredient.itemDef, num13, 0uL);\n\t\t\t\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\titem2.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.Recycler);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnRecyclerItemProduced(item2.info.shortname, item2.amount, this, slot);\n\t\t\t\t\t\tif (!MoveItemToOutput(item2))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnum10 -= num13;\n\t\t\t\t\t\tif (num10 <= 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (flag || !HasRecyclable())\n\t\t{\n\t\t\tStopRecycling();\n\t\t}\n\t\tbreak;\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Recycler",
      "MethodName": "RecycleThink",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3506991312,
      "Name": "CanCombineDroppedItem",
      "FullName": "CanCombineDroppedItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "droppedItem",
          "typeName": "DroppedItem",
          "optional": false
        },
        {
          "name": "di",
          "typeName": "DroppedItem",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to combine dropped item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnDroppedOn(DroppedItem di)\n{\n\tif (item == null || Oxide.Core.Interface.CallHook(\"CanCombineDroppedItem\", this, di) != null || NeverCombine || di.NeverCombine || !item.CanStack(di.item))\n\t{\n\t\treturn;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnDroppedItemCombined\", this);\n\tint num = di.item.amount + item.amount;\n\tif (num <= item.MaxStackable() && num != 0)\n\t{\n\t\tif (di.DropReason == DroppedItem.DropReasonEnum.Player)\n\t\t{\n\t\t\tDropReason = DroppedItem.DropReasonEnum.Player;\n\t\t}\n\t\tdi.item.MigrateItemOwnership(item, di.item.amount);\n\t\tdi.DestroyItem();\n\t\tdi.Kill();\n\t\tint worldModelIndex = item.info.GetWorldModelIndex(item.amount);\n\t\titem.amount = num;\n\t\titem.MarkDirty();\n\t\tif (GetDespawnDuration() < float.PositiveInfinity)\n\t\t{\n\t\t\tInvoke(IdleDestroy, GetDespawnDuration());\n\t\t}\n\t\tEffect.server.Run(\"assets/bundled/prefabs/fx/notice/stack.world.fx.prefab\", this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tint worldModelIndex2 = item.info.GetWorldModelIndex(item.amount);\n\t\tif (worldModelIndex != worldModelIndex2)\n\t\t{\n\t\t\titem.Drop(base.transform.position, UnityEngine.Vector3.zero, base.transform.rotation);\n\t\t}\n\t}\n}\n",
      "ParametersText": "DroppedItem droppedItem, DroppedItem di",
      "TargetName": "DroppedItem",
      "MethodName": "OnDroppedOn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 744056691,
      "Name": "OnDroppedItemCombined",
      "FullName": "OnDroppedItemCombined",
      "Category": "Item",
      "Parameters": [
        {
          "name": "droppedItem",
          "typeName": "DroppedItem",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a dropped item is combined."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnDroppedOn(DroppedItem di)\n{\n\tif (item == null || Oxide.Core.Interface.CallHook(\"CanCombineDroppedItem\", this, di) != null || NeverCombine || di.NeverCombine || !item.CanStack(di.item))\n\t{\n\t\treturn;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnDroppedItemCombined\", this);\n\tint num = di.item.amount + item.amount;\n\tif (num <= item.MaxStackable() && num != 0)\n\t{\n\t\tif (di.DropReason == DroppedItem.DropReasonEnum.Player)\n\t\t{\n\t\t\tDropReason = DroppedItem.DropReasonEnum.Player;\n\t\t}\n\t\tdi.item.MigrateItemOwnership(item, di.item.amount);\n\t\tdi.DestroyItem();\n\t\tdi.Kill();\n\t\tint worldModelIndex = item.info.GetWorldModelIndex(item.amount);\n\t\titem.amount = num;\n\t\titem.MarkDirty();\n\t\tif (GetDespawnDuration() < float.PositiveInfinity)\n\t\t{\n\t\t\tInvoke(IdleDestroy, GetDespawnDuration());\n\t\t}\n\t\tEffect.server.Run(\"assets/bundled/prefabs/fx/notice/stack.world.fx.prefab\", this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tint worldModelIndex2 = item.info.GetWorldModelIndex(item.amount);\n\t\tif (worldModelIndex != worldModelIndex2)\n\t\t{\n\t\t\titem.Drop(base.transform.position, UnityEngine.Vector3.zero, base.transform.rotation);\n\t\t}\n\t}\n}\n",
      "ParametersText": "DroppedItem droppedItem",
      "TargetName": "DroppedItem",
      "MethodName": "OnDroppedOn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 214500625,
      "Name": "OnItemDespawn",
      "FullName": "OnItemDespawn",
      "Category": "Item",
      "Parameters": [
        {
          "name": "droppedItem",
          "typeName": "DroppedItem",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item despawn occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void IdleDestroy()\n{\n\tOxide.Core.Interface.CallHook(\"OnItemDespawn\", item);\n\tFacepunch.Rust.Analytics.Azure.OnItemDespawn(this, item, (int)DropReason, DroppedBy);\n\tif (item != null)\n\t{\n\t\tBuriedItems.Instance.Register(item, base.transform.position);\n\t}\n\tDestroyItem();\n\tKill();\n}\n",
      "ParametersText": "DroppedItem droppedItem",
      "TargetName": "DroppedItem",
      "MethodName": "IdleDestroy",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1235377971,
      "Name": "OnBonusItemDrop",
      "FullName": "OnBonusItemDrop",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local5",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "container",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bonus item is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local5, BasePlayer local0, ItemContainer container",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4037264508,
      "Name": "OnBonusItemDropped",
      "FullName": "OnBonusItemDropped",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local5",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "container",
          "typeName": "ItemContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bonus item is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local5, BasePlayer local0, ItemContainer container",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 540957299,
      "Name": "OnBonusItemDropped [patch 1]",
      "FullName": "OnBonusItemDropped [patch 1]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 561791815,
      "Name": "OnBonusItemDropped [patch 2]",
      "FullName": "OnBonusItemDropped [patch 2]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 194988291,
      "Name": "OnBonusItemDropped [patch 3]",
      "FullName": "OnBonusItemDropped [patch 3]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3980795917,
      "Name": "OnBonusItemDropped [patch 4]",
      "FullName": "OnBonusItemDropped [patch 4]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2162973781,
      "Name": "OnBonusItemDropped [patch 5]",
      "FullName": "OnBonusItemDropped [patch 5]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void DropBonusItems(BaseEntity initiator, ItemContainer container)\n{\n\tbase.DropBonusItems(initiator, container);\n\tif (initiator == null || container == null)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer = initiator as BasePlayer;\n\tif (basePlayer == null || scrapAmount <= 0 || !(scrapDef != null))\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((basePlayer.modifiers != null) ? (1f + basePlayer.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield)) : 0f);\n\tif (!(num > 1f))\n\t{\n\t\treturn;\n\t}\n\tfloat variableValue = basePlayer.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);\n\tfloat num2 = UnityEngine.Mathf.Max((float)scrapAmount * num - (float)scrapAmount, 0f);\n\tvariableValue += num2;\n\tint num3 = 0;\n\tif (variableValue >= 1f)\n\t{\n\t\tnum3 = (int)variableValue;\n\t\tvariableValue -= (float)num3;\n\t}\n\tbasePlayer.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, variableValue);\n\tif (num3 > 0)\n\t{\n\t\tItem item = ItemManager.Create(scrapDef, num3, 0uL);\n\t\tif (item != null && Oxide.Core.Interface.CallHook(\"OnBonusItemDrop\", item, basePlayer, container) == null)\n\t\t{\n\t\t\t(item.Drop(GetDropPosition() + new UnityEngine.Vector3(0f, 0.5f, 0f), GetInheritedDropVelocity()) as DroppedItem).DropReason = DroppedItem.DropReasonEnum.Loot;\n\t\t\tOxide.Core.Interface.CallHook(\"OnBonusItemDropped\", item, basePlayer, container);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "LootContainer",
      "MethodName": "DropBonusItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2274779210,
      "Name": "OnItemRefill",
      "FullName": "OnItemRefill",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item refills."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ServerCommand(Item item, string command, BasePlayer player)\n{\n\tif (command == \"refill\" && !player.IsSwimming() && HasCraftLevel(player) && !(item.conditionNormalized >= 1f) && Oxide.Core.Interface.CallHook(\"OnItemRefill\", item, player) == null)\n\t{\n\t\tfloat conditionNormalized = item.conditionNormalized;\n\t\tfloat maxConditionNormalized = item.maxConditionNormalized;\n\t\titem.DoRepair(conditionLost);\n\t\tif (successEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(successEffect.resourcePath, player.eyes.position);\n\t\t}\n\t\tFacepunch.Rust.Analytics.Azure.OnItemRepaired(player, player.GetCachedCraftLevelWorkbench(), item, conditionNormalized, maxConditionNormalized);\n\t}\n}\n",
      "ParametersText": "Item item, BasePlayer player",
      "TargetName": "ItemModRepair",
      "MethodName": "ServerCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2108135861,
      "Name": "OnItemSubmit",
      "FullName": "OnItemSubmit",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "mailbox",
          "typeName": "Mailbox",
          "optional": false
        },
        {
          "name": "fromPlayer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item submit occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SubmitInputItems(BasePlayer fromPlayer)\n{\n\tfor (int i = 0; i < InputContainer.capacity; i++)\n\t{\n\t\tItem slot = InputContainer.GetSlot(i);\n\t\tif (slot != null && Oxide.Core.Interface.CallHook(\"OnItemSubmit\", slot, this, fromPlayer) == null && slot.MoveToContainer(base.inventory))\n\t\t{\n\t\t\tEffect.server.Run(mailDropSound.resourcePath, GetDropPosition());\n\t\t\tif (fromPlayer != null && !PlayerIsOwner(fromPlayer))\n\t\t\t{\n\t\t\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local1, Mailbox mailbox, BasePlayer fromPlayer",
      "TargetName": "Mailbox",
      "MethodName": "SubmitInputItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2108135861,
      "Name": "OnItemSubmit",
      "FullName": "OnItemSubmit [patch]",
      "Category": "Item",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when item submit occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SubmitInputItems(BasePlayer fromPlayer)\n{\n\tfor (int i = 0; i < InputContainer.capacity; i++)\n\t{\n\t\tItem slot = InputContainer.GetSlot(i);\n\t\tif (slot != null && Oxide.Core.Interface.CallHook(\"OnItemSubmit\", slot, this, fromPlayer) == null && slot.MoveToContainer(base.inventory))\n\t\t{\n\t\t\tEffect.server.Run(mailDropSound.resourcePath, GetDropPosition());\n\t\t\tif (fromPlayer != null && !PlayerIsOwner(fromPlayer))\n\t\t\t{\n\t\t\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "Mailbox",
      "MethodName": "SubmitInputItems",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 283863316,
      "Name": "OnItemUnwrap",
      "FullName": "OnItemUnwrap",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "itemModUnwrap",
          "typeName": "ItemModUnwrap",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item unwrap occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ServerCommand(Item item, string command, BasePlayer player)\n{\n\tif (command == \"unwrap\" && item.amount > 0 && Oxide.Core.Interface.CallHook(\"OnItemUnwrap\", item, player, this) == null)\n\t{\n\t\titem.UseItem();\n\t\tint num = UnityEngine.Random.Range(minTries, maxTries + 1);\n\t\tItemOwnershipShare ownership = default(ItemOwnershipShare);\n\t\tif (OwnershipPhrase != null && !string.IsNullOrEmpty(OwnershipPhrase.token))\n\t\t{\n\t\t\tItemOwnershipShare itemOwnershipShare = default(ItemOwnershipShare);\n\t\t\titemOwnershipShare.username = player.displayName;\n\t\t\titemOwnershipShare.reason = OwnershipPhrase.token;\n\t\t\townership = itemOwnershipShare;\n\t\t}\n\t\tfor (int i = 0; i < num; i++)\n\t\t{\n\t\t\trevealList.SpawnIntoContainer(player.inventory.containerMain, ownership, player.inventory.containerBelt);\n\t\t}\n\t\tif (successEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(successEffect.resourcePath, player.eyes.position);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item item, BasePlayer player, ItemModUnwrap itemModUnwrap",
      "TargetName": "ItemModUnwrap",
      "MethodName": "ServerCommand",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2127678047,
      "Name": "OnItemPainted",
      "FullName": "OnItemPainted",
      "Category": "Item",
      "Parameters": [
        {
          "name": "paintedItemStorageEntity",
          "typeName": "PaintedItemStorageEntity",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Byte[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an item is painted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\nprivate void Server_UpdateImage(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player == null || (ulong)msg.player.userID != base.OwnerID)\n\t{\n\t\treturn;\n\t}\n\tforeach (Item item2 in msg.player.inventory.containerWear.itemList)\n\t{\n\t\tif (item2.instanceData != null && item2.instanceData.subEntity == net.ID)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\tItem item = msg.player.inventory.FindBySubEntityID(net.ID);\n\tif (item == null || item.isBroken)\n\t{\n\t\treturn;\n\t}\n\tbyte[] array = msg.read.BytesWithSize();\n\tif (array == null)\n\t{\n\t\tif (_currentImageCrc != 0)\n\t\t{\n\t\t\tFileStorage.server.RemoveExact(_currentImageCrc, FileStorage.Type.png, net.ID, 0u);\n\t\t}\n\t\t_currentImageCrc = 0u;\n\t}\n\telse\n\t{\n\t\tif (!ImageProcessing.IsValidPNG(array, 512, 512))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tuint currentImageCrc = _currentImageCrc;\n\t\tif (_currentImageCrc != 0)\n\t\t{\n\t\t\tFileStorage.server.RemoveExact(_currentImageCrc, FileStorage.Type.png, net.ID, 0u);\n\t\t}\n\t\t_currentImageCrc = FileStorage.server.Store(array, FileStorage.Type.png, net.ID);\n\t\tif (_currentImageCrc != currentImageCrc)\n\t\t{\n\t\t\titem.LoseCondition(0.25f);\n\t\t}\n\t\tlastEditedBy = msg.player.userID;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnItemPainted\", this, item, msg.player, array);\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "PaintedItemStorageEntity paintedItemStorageEntity, Item local0, BasePlayer player, System.Byte[] local1",
      "TargetName": "PaintedItemStorageEntity",
      "MethodName": "Server_UpdateImage",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3730208425,
      "Name": "OnInventoryAmmoItemFind",
      "FullName": "OnInventoryAmmoItemFind [Chainsaw]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "inventory",
          "typeName": "PlayerInventory",
          "optional": false
        },
        {
          "name": "chainsaw",
          "typeName": "Chainsaw",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory ammo item is found."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item GetAmmo()\n{\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn null;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnInventoryAmmoItemFind\", ownerPlayer.inventory, fuelType);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\treturn ownerPlayer.inventory.FindItemByItemName(fuelType.shortname);\n}\n",
      "ParametersText": "PlayerInventory inventory, Chainsaw chainsaw",
      "TargetName": "Chainsaw",
      "MethodName": "GetAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 3730208425,
      "Name": "OnInventoryAmmoItemFind",
      "FullName": "OnInventoryAmmoItemFind [FlameThrower]",
      "Category": "Item",
      "Parameters": [
        {
          "name": "inventory",
          "typeName": "PlayerInventory",
          "optional": false
        },
        {
          "name": "flameThrower",
          "typeName": "FlameThrower",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inventory ammo item is found."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public Item GetAmmo()\n{\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn null;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnInventoryAmmoItemFind\", ownerPlayer.inventory, fuelType);\n\tif (obj is Item)\n\t{\n\t\treturn (Item)obj;\n\t}\n\treturn ownerPlayer.inventory.FindItemByItemName(fuelType.shortname);\n}\n",
      "ParametersText": "PlayerInventory inventory, FlameThrower flameThrower",
      "TargetName": "FlameThrower",
      "MethodName": "GetAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "Item"
    },
    {
      "Id": 1157802010,
      "Name": "OnRackedWeaponMount",
      "FullName": "OnRackedWeaponMount",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a racked weapon is mounted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void MountWeapon(BasePlayer player, int gridCellIndex, int rotation)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tHeldEntity heldEntity = player.GetHeldEntity();\n\tif (!(heldEntity == null))\n\t{\n\t\tItem item = heldEntity.GetItem();\n\t\tif (item != null)\n\t\t{\n\t\t\tMountWeapon(item, player, gridCellIndex, rotation);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item item, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "MountWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1049908860,
      "Name": "OnRackedWeaponMounted",
      "FullName": "OnRackedWeaponMounted",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a racked weapon is mounted."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void MountWeapon(BasePlayer player, int gridCellIndex, int rotation)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tHeldEntity heldEntity = player.GetHeldEntity();\n\tif (!(heldEntity == null))\n\t{\n\t\tItem item = heldEntity.GetItem();\n\t\tif (item != null)\n\t\t{\n\t\t\tMountWeapon(item, player, gridCellIndex, rotation);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item item, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "MountWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3562654725,
      "Name": "OnRackedWeaponSwap",
      "FullName": "OnRackedWeaponSwap",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "WeaponRackSlot",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SwapPlayerWeapon(BasePlayer player, int gridCellIndex, int takeFromBeltIndex, int rotation)\n{\n\tItem item = player.GetHeldEntity()?.GetItem();\n\tif (item == null)\n\t{\n\t\treturn;\n\t}\n\tWorldModelRackMountConfig forItemDef = WorldModelRackMountConfig.GetForItemDef(item.info);\n\tif (forItemDef == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(gridCellIndex);\n\tif (weaponAtIndex != null)\n\t{\n\t\tint mountSlotIndex = gridCellIndex;\n\t\tif (CustomRackType != 0)\n\t\t{\n\t\t\tgridCellIndex = 0;\n\t\t}\n\t\tint bestPlacementCellIndex = GetBestPlacementCellIndex(GetXYForIndex(gridCellIndex), forItemDef, rotation, weaponAtIndex);\n\t\tif (bestPlacementCellIndex != -1 && Oxide.Core.Interface.CallHook(\"OnRackedWeaponSwap\", item, weaponAtIndex, player, this) == null)\n\t\t{\n\t\t\titem.RemoveFromContainer();\n\t\t\tGivePlayerWeapon(player, mountSlotIndex, takeFromBeltIndex, tryHold: false);\n\t\t\tMountWeapon(item, player, bestPlacementCellIndex, rotation, sendUpdate: false);\n\t\t\tItemManager.DoRemoves();\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnRackedWeaponSwapped\", item, weaponAtIndex, player, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local0, WeaponRackSlot local2, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "SwapPlayerWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2954263053,
      "Name": "OnRackedWeaponSwapped",
      "FullName": "OnRackedWeaponSwapped",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "WeaponRackSlot",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SwapPlayerWeapon(BasePlayer player, int gridCellIndex, int takeFromBeltIndex, int rotation)\n{\n\tItem item = player.GetHeldEntity()?.GetItem();\n\tif (item == null)\n\t{\n\t\treturn;\n\t}\n\tWorldModelRackMountConfig forItemDef = WorldModelRackMountConfig.GetForItemDef(item.info);\n\tif (forItemDef == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(gridCellIndex);\n\tif (weaponAtIndex != null)\n\t{\n\t\tint mountSlotIndex = gridCellIndex;\n\t\tif (CustomRackType != 0)\n\t\t{\n\t\t\tgridCellIndex = 0;\n\t\t}\n\t\tint bestPlacementCellIndex = GetBestPlacementCellIndex(GetXYForIndex(gridCellIndex), forItemDef, rotation, weaponAtIndex);\n\t\tif (bestPlacementCellIndex != -1 && Oxide.Core.Interface.CallHook(\"OnRackedWeaponSwap\", item, weaponAtIndex, player, this) == null)\n\t\t{\n\t\t\titem.RemoveFromContainer();\n\t\t\tGivePlayerWeapon(player, mountSlotIndex, takeFromBeltIndex, tryHold: false);\n\t\t\tMountWeapon(item, player, bestPlacementCellIndex, rotation, sendUpdate: false);\n\t\t\tItemManager.DoRemoves();\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnRackedWeaponSwapped\", item, weaponAtIndex, player, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local0, WeaponRackSlot local2, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "SwapPlayerWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 411927536,
      "Name": "OnRackedWeaponTake",
      "FullName": "OnRackedWeaponTake",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void GivePlayerWeapon(BasePlayer player, int mountSlotIndex, int playerBeltIndex = -1, bool tryHold = true, bool sendUpdate = true)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex == null)\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponTake\", slot, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tClearSlot(weaponAtIndex);\n\tbool flag = false;\n\tbool flag2 = true;\n\tif (slot.IsBackpack())\n\t{\n\t\tflag2 = false;\n\t\tif (slot.info.GetComponent<ItemModBackpack>() != null && player.inventory.GetAnyBackpack() == null)\n\t\t{\n\t\t\tflag = slot.MoveToContainer(player.inventory.containerWear);\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\tflag = slot.MoveToContainer(player.inventory.containerBelt, playerBeltIndex);\n\t}\n\tif (flag)\n\t{\n\t\tif (flag2 && ((tryHold && player.GetHeldEntity() == null) || playerBeltIndex != -1))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"SetActiveBeltSlot\", player), slot.position, slot.uid);\n\t\t}\n\t\tClientRPC(RpcTarget.Player(\"PlayGrabSound\", player), slot.info.itemid);\n\t}\n\telse if (!slot.MoveToContainer(player.inventory.containerMain))\n\t{\n\t\tslot.Drop(base.inventory.dropPosition, base.inventory.dropVelocity);\n\t}\n\tif (sendUpdate)\n\t{\n\t\tItemManager.DoRemoves();\n\t\tSendNetworkUpdateImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnRackedWeaponTaken\", slot, player, this);\n}\n",
      "ParametersText": "Item local1, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "GivePlayerWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3033876624,
      "Name": "OnRackedWeaponTaken",
      "FullName": "OnRackedWeaponTaken",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void GivePlayerWeapon(BasePlayer player, int mountSlotIndex, int playerBeltIndex = -1, bool tryHold = true, bool sendUpdate = true)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex == null)\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponTake\", slot, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tClearSlot(weaponAtIndex);\n\tbool flag = false;\n\tbool flag2 = true;\n\tif (slot.IsBackpack())\n\t{\n\t\tflag2 = false;\n\t\tif (slot.info.GetComponent<ItemModBackpack>() != null && player.inventory.GetAnyBackpack() == null)\n\t\t{\n\t\t\tflag = slot.MoveToContainer(player.inventory.containerWear);\n\t\t}\n\t}\n\tif (!flag)\n\t{\n\t\tflag = slot.MoveToContainer(player.inventory.containerBelt, playerBeltIndex);\n\t}\n\tif (flag)\n\t{\n\t\tif (flag2 && ((tryHold && player.GetHeldEntity() == null) || playerBeltIndex != -1))\n\t\t{\n\t\t\tClientRPC(RpcTarget.Player(\"SetActiveBeltSlot\", player), slot.position, slot.uid);\n\t\t}\n\t\tClientRPC(RpcTarget.Player(\"PlayGrabSound\", player), slot.info.itemid);\n\t}\n\telse if (!slot.MoveToContainer(player.inventory.containerMain))\n\t{\n\t\tslot.Drop(base.inventory.dropPosition, base.inventory.dropVelocity);\n\t}\n\tif (sendUpdate)\n\t{\n\t\tItemManager.DoRemoves();\n\t\tSendNetworkUpdateImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnRackedWeaponTaken\", slot, player, this);\n}\n",
      "ParametersText": "Item local1, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "GivePlayerWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2853729425,
      "Name": "OnRackedWeaponUnload",
      "FullName": "OnRackedWeaponUnload",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void UnloadWeapon(BasePlayer player, int mountSlotIndex)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex == null || !weaponAtIndex.CanBeReloadedAtWeaponRack())\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponUnload\", slot, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity heldEntity = slot.GetHeldEntity();\n\tif (!(heldEntity == null))\n\t{\n\t\tBaseProjectile component = heldEntity.GetComponent<BaseProjectile>();\n\t\tif (!(component == null))\n\t\t{\n\t\t\tItemDefinition ammoType = component.primaryMagazine.ammoType;\n\t\t\tcomponent.UnloadAmmo(slot, player);\n\t\t\tSetSlotAmmoDetails(weaponAtIndex, slot);\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tClientRPC(RpcTarget.Player(\"PlayAmmoSound\", player), ammoType.itemid, 1);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRackedWeaponUnloaded\", slot, player, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local1, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "UnloadWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 18069347,
      "Name": "OnRackedWeaponUnloaded",
      "FullName": "OnRackedWeaponUnloaded",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void UnloadWeapon(BasePlayer player, int mountSlotIndex)\n{\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(mountSlotIndex);\n\tif (weaponAtIndex == null || !weaponAtIndex.CanBeReloadedAtWeaponRack())\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponUnload\", slot, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity heldEntity = slot.GetHeldEntity();\n\tif (!(heldEntity == null))\n\t{\n\t\tBaseProjectile component = heldEntity.GetComponent<BaseProjectile>();\n\t\tif (!(component == null))\n\t\t{\n\t\t\tItemDefinition ammoType = component.primaryMagazine.ammoType;\n\t\t\tcomponent.UnloadAmmo(slot, player);\n\t\t\tSetSlotAmmoDetails(weaponAtIndex, slot);\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tClientRPC(RpcTarget.Player(\"PlayAmmoSound\", player), ammoType.itemid, 1);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRackedWeaponUnloaded\", slot, player, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Item local1, BasePlayer player, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "UnloadWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2919494006,
      "Name": "OnRackedWeaponLoad",
      "FullName": "OnRackedWeaponLoad",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local4",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "ItemDefinition",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\nprivate void LoadWeaponAmmo(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!player)\n\t{\n\t\treturn;\n\t}\n\tint gridIndex = msg.read.Int32();\n\tint num = msg.read.Int32();\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(gridIndex);\n\tif (weaponAtIndex == null || !weaponAtIndex.CanBeReloadedAtWeaponRack())\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity heldEntity = slot.GetHeldEntity();\n\tif (heldEntity == null)\n\t{\n\t\treturn;\n\t}\n\tBaseProjectile component = heldEntity.GetComponent<BaseProjectile>();\n\tif (component == null)\n\t{\n\t\treturn;\n\t}\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(num);\n\tif (itemDefinition == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponLoad\", slot, itemDefinition, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (itemDefinition == SnowballGun.SnowballInventoryItem)\n\t{\n\t\titemDefinition = SnowballGun.SnowballAmmoItem;\n\t\tif (!(itemDefinition != null))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tnum = itemDefinition.itemid;\n\t}\n\tif (itemDefinition == null)\n\t{\n\t\treturn;\n\t}\n\tItemModProjectile component2 = itemDefinition.GetComponent<ItemModProjectile>();\n\tif (!(component2 == null) && component2.IsAmmo(component.primaryMagazine.definition.ammoTypes))\n\t{\n\t\tif (num != component.primaryMagazine.ammoType.itemid && component.primaryMagazine.contents > 0)\n\t\t{\n\t\t\tplayer.GiveItem(ItemManager.CreateByItemID(component.primaryMagazine.ammoType.itemid, component.primaryMagazine.contents, 0uL));\n\t\t\tcomponent.SetAmmoCount(0);\n\t\t}\n\t\tcomponent.primaryMagazine.ammoType = itemDefinition;\n\t\tcomponent.TryReloadMagazine(player.inventory);\n\t\tSetSlotAmmoDetails(weaponAtIndex, slot);\n\t\tSendNetworkUpdateImmediate();\n\t\tClientRPC(RpcTarget.Player(\"PlayAmmoSound\", player), itemDefinition.itemid, 0);\n\t\tOxide.Core.Interface.CallHook(\"OnRackedWeaponLoaded\", slot, itemDefinition, player, this);\n\t}\n}\n",
      "ParametersText": "Item local4, ItemDefinition local7, BasePlayer local0, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "LoadWeaponAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2867370870,
      "Name": "OnRackedWeaponLoaded",
      "FullName": "OnRackedWeaponLoaded",
      "Category": "Item",
      "Parameters": [
        {
          "name": "local4",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "ItemDefinition",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "weaponRack",
          "typeName": "WeaponRack",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to control taking items from a weapon rack."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\nprivate void LoadWeaponAmmo(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!player)\n\t{\n\t\treturn;\n\t}\n\tint gridIndex = msg.read.Int32();\n\tint num = msg.read.Int32();\n\tWeaponRackSlot weaponAtIndex = GetWeaponAtIndex(gridIndex);\n\tif (weaponAtIndex == null || !weaponAtIndex.CanBeReloadedAtWeaponRack())\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.GetSlot(weaponAtIndex.InventoryIndex);\n\tif (slot == null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity heldEntity = slot.GetHeldEntity();\n\tif (heldEntity == null)\n\t{\n\t\treturn;\n\t}\n\tBaseProjectile component = heldEntity.GetComponent<BaseProjectile>();\n\tif (component == null)\n\t{\n\t\treturn;\n\t}\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(num);\n\tif (itemDefinition == null || Oxide.Core.Interface.CallHook(\"OnRackedWeaponLoad\", slot, itemDefinition, player, this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (itemDefinition == SnowballGun.SnowballInventoryItem)\n\t{\n\t\titemDefinition = SnowballGun.SnowballAmmoItem;\n\t\tif (!(itemDefinition != null))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tnum = itemDefinition.itemid;\n\t}\n\tif (itemDefinition == null)\n\t{\n\t\treturn;\n\t}\n\tItemModProjectile component2 = itemDefinition.GetComponent<ItemModProjectile>();\n\tif (!(component2 == null) && component2.IsAmmo(component.primaryMagazine.definition.ammoTypes))\n\t{\n\t\tif (num != component.primaryMagazine.ammoType.itemid && component.primaryMagazine.contents > 0)\n\t\t{\n\t\t\tplayer.GiveItem(ItemManager.CreateByItemID(component.primaryMagazine.ammoType.itemid, component.primaryMagazine.contents, 0uL));\n\t\t\tcomponent.SetAmmoCount(0);\n\t\t}\n\t\tcomponent.primaryMagazine.ammoType = itemDefinition;\n\t\tcomponent.TryReloadMagazine(player.inventory);\n\t\tSetSlotAmmoDetails(weaponAtIndex, slot);\n\t\tSendNetworkUpdateImmediate();\n\t\tClientRPC(RpcTarget.Player(\"PlayAmmoSound\", player), itemDefinition.itemid, 0);\n\t\tOxide.Core.Interface.CallHook(\"OnRackedWeaponLoaded\", slot, itemDefinition, player, this);\n\t}\n}\n",
      "ParametersText": "Item local4, ItemDefinition local7, BasePlayer local0, WeaponRack weaponRack",
      "TargetName": "WeaponRack",
      "MethodName": "LoadWeaponAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1026445911,
      "Name": "CanLockerAcceptItem",
      "FullName": "CanLockerAcceptItem",
      "Category": "Item",
      "Parameters": [
        {
          "name": "locker",
          "typeName": "Locker",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to locker accept item.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool ItemFilter(Item item, int targetSlot)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanLockerAcceptItem\", this, item, targetSlot);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!base.ItemFilter(item, targetSlot))\n\t{\n\t\treturn false;\n\t}\n\tbool num = item.IsBackpack();\n\tbool flag = IsBackpackSlot(targetSlot);\n\tif (num != flag)\n\t{\n\t\treturn false;\n\t}\n\tif (isTransferringIndustrialItem && GetRowType(targetSlot) == Locker.RowType.Belt && item.info.category == ItemCategory.Attire)\n\t{\n\t\treturn false;\n\t}\n\tif (item.info.category == ItemCategory.Attire)\n\t{\n\t\treturn true;\n\t}\n\treturn GetRowType(targetSlot) == Locker.RowType.Belt;\n}\n",
      "ParametersText": "Locker locker",
      "TargetName": "Locker",
      "MethodName": "ItemFilter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 44080502,
      "Name": "OnItemFilter",
      "FullName": "OnItemFilter",
      "Category": "Item",
      "Parameters": [
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "storageContainer",
          "typeName": "StorageContainer",
          "optional": false
        },
        {
          "name": "targetSlot",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when item filter occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool ItemFilter(Item item, int targetSlot)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnItemFilter\", item, this, targetSlot);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (onlyAcceptCategory == ItemCategory.All)\n\t{\n\t\treturn true;\n\t}\n\treturn item.info.category == onlyAcceptCategory;\n}\n",
      "ParametersText": "Item item, StorageContainer storageContainer, int targetSlot",
      "TargetName": "StorageContainer",
      "MethodName": "ItemFilter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    }
  ],
  "Mission": [
    {
      "Id": 63503158,
      "Name": "OnMissionFailed",
      "FullName": "OnMissionFailed",
      "Category": "Mission",
      "Parameters": [
        {
          "name": "baseMission",
          "typeName": "BaseMission",
          "optional": false
        },
        {
          "name": "instance",
          "typeName": "BaseMission+MissionInstance",
          "optional": false
        },
        {
          "name": "assignee",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "failReason",
          "typeName": "BaseMission+MissionFailReason",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mission fails."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void MissionFailed(BaseMission.MissionInstance instance, BasePlayer assignee, BaseMission.MissionFailReason failReason, bool saveImmediately = true)\n{\n\tif (!instance.GetMission().completeSilently)\n\t{\n\t\tassignee.Server_SendMissionFailed(instance.missionID, failReason);\n\t\tif (failReason != BaseMission.MissionFailReason.ResetPlayerState)\n\t\t{\n\t\t\tDoMissionEffect(failedEffect.resourcePath, assignee);\n\t\t}\n\t}\n\tFacepunch.Rust.Analytics.Azure.OnMissionComplete(assignee, this, failReason);\n\tinstance.status = BaseMission.MissionStatus.Failed;\n\tMissionEnded(instance, assignee);\n\tOxide.Core.Interface.CallHook(\"OnMissionFailed\", this, instance, assignee, failReason);\n\tassignee.MissionsDirty(saveImmediately);\n}\n",
      "ParametersText": "BaseMission baseMission, BaseMission.MissionInstance instance, BasePlayer assignee, BaseMission.MissionFailReason failReason",
      "TargetName": "BaseMission",
      "MethodName": "MissionFailed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2044371482,
      "Name": "OnMissionSucceeded",
      "FullName": "OnMissionSucceeded",
      "Category": "Mission",
      "Parameters": [
        {
          "name": "baseMission",
          "typeName": "BaseMission",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mission is succeeded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void MissionSuccess(BaseMission.MissionInstance instance, BasePlayer assignee)\n{\n\tinstance.status = BaseMission.MissionStatus.Accomplished;\n\tMissionEnded(instance, assignee);\n\tMissionComplete(instance, assignee);\n\tOxide.Core.Interface.CallHook(\"OnMissionSucceeded\", this, instance, assignee);\n}\n",
      "ParametersText": "BaseMission baseMission",
      "TargetName": "BaseMission",
      "MethodName": "MissionSuccess",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 711033722,
      "Name": "OnMissionStart",
      "FullName": "OnMissionStart",
      "Category": "Mission",
      "Parameters": [
        {
          "name": "baseMission",
          "typeName": "BaseMission",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mission starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void MissionStart(BaseMission.MissionInstance instance, BasePlayer assignee)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnMissionStart\", this, instance, assignee) != null)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i < objectives.Length; i++)\n\t{\n\t\tobjectives[i].Get().MissionStarted(i, instance, assignee);\n\t}\n\tif (acceptEffect.isValid)\n\t{\n\t\tDoMissionEffect(acceptEffect.resourcePath, assignee);\n\t}\n\tBaseMission.MissionEntityEntry[] array = spawnMissionEntityDefinitions;\n\tforeach (BaseMission.MissionEntityEntry missionEntityEntry in array)\n\t{\n\t\tif (missionEntityEntry.spawnOnMissionStart)\n\t\t{\n\t\t\tinstance.GetSpawnedMissionEntity(missionEntityEntry.identifier, assignee);\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnMissionStarted\", this, instance, assignee);\n}\n",
      "ParametersText": "BaseMission baseMission",
      "TargetName": "BaseMission",
      "MethodName": "MissionStart",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1070103224,
      "Name": "CanAssignMission",
      "FullName": "CanAssignMission",
      "Category": "Mission",
      "Parameters": [
        {
          "name": "assignee",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "mission",
          "typeName": "BaseMission",
          "optional": false
        },
        {
          "name": "provider",
          "typeName": "IMissionProvider",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to assign mission.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool AssignMission(BasePlayer assignee, IMissionProvider provider, BaseMission mission)\n{\n\tif (!missionsenabled)\n\t{\n\t\treturn false;\n\t}\n\tif (!assignee.Server_CanAcceptMission(provider.ProviderID(), mission))\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAssignMission\", assignee, mission, provider);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!server_missionInstanceValidStates.TryGetValue(new BaseMission.MissionIdentifierData(mission, provider.ProviderID()), out var value))\n\t{\n\t\treturn false;\n\t}\n\tBaseMission.MissionInstance missionInstance = null;\n\tint num = -1;\n\tfor (int i = 0; i < assignee.acceptedMissions.Count; i++)\n\t{\n\t\tBaseMission.MissionInstance missionInstance2 = assignee.acceptedMissions[i];\n\t\tif (mission.id == missionInstance2.missionID)\n\t\t{\n\t\t\tnum = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tint activeMissionIndex;\n\tif (num >= 0)\n\t{\n\t\tmissionInstance = assignee.acceptedMissions[num];\n\t\tactiveMissionIndex = num;\n\t\tmissionInstance.Reset();\n\t}\n\telse\n\t{\n\t\tmissionInstance = Facepunch.Pool.Get<BaseMission.MissionInstance>();\n\t\tactiveMissionIndex = assignee.acceptedMissions.Count;\n\t\tassignee.acceptedMissions.Add(missionInstance);\n\t}\n\tmissionInstance.missionID = mission.id;\n\tmissionInstance.startTimeUtcSeconds = System.DateTimeOffset.UtcNow.ToUnixTimeSeconds();\n\tmissionInstance.providerID = provider.ProviderID();\n\tmissionInstance.status = BaseMission.MissionStatus.Active;\n\tforeach (System.Collections.Generic.KeyValuePair<string, UnityEngine.Vector3> missionPoint in value.missionInstance.missionPoints)\n\t{\n\t\tstring key = missionPoint.Key;\n\t\tUnityEngine.Vector3 value2 = missionPoint.Value;\n\t\tmissionInstance.missionPoints.Add(key, value2);\n\t\tif (mission.TryGetPositionGenerator(key, out var positionGenerator) && positionGenerator.positionsAreExclusive)\n\t\t{\n\t\t\tAddPositionBlocker(missionInstance, value2);\n\t\t}\n\t}\n\tmission.Server_UpdateMissionValidState(provider.ProviderID(), out var _);\n\tfor (int j = 0; j < mission.objectives.Length; j++)\n\t{\n\t\tBaseMission.MissionInstance.ObjectiveStatus element = Facepunch.Pool.Get<BaseMission.MissionInstance.ObjectiveStatus>();\n\t\tmissionInstance.objectiveStatuses.Add(element);\n\t}\n\tif (missionInstance.objectiveStatuses.Count != mission.objectives.Length)\n\t{\n\t\tUnityEngine.Debug.LogError($\"New mission instance for {mission.name} has {missionInstance.objectiveStatuses.Count} objective statuses but mission has {mission.objectives.Length} objectives\", mission);\n\t}\n\tmission.MissionStart(missionInstance, assignee);\n\tassignee.SetActiveMissionIndex(activeMissionIndex);\n\tassignee.MissionsDirty(saveImmediately: true);\n\tOxide.Core.Interface.CallHook(\"OnMissionAssigned\", mission, provider, assignee);\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer assignee, BaseMission mission, IMissionProvider provider",
      "TargetName": "BaseMission",
      "MethodName": "AssignMission",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2072569864,
      "Name": "OnMissionAssigned",
      "FullName": "OnMissionAssigned",
      "Category": "Mission",
      "Parameters": [
        {
          "name": "mission",
          "typeName": "BaseMission",
          "optional": false
        },
        {
          "name": "provider",
          "typeName": "IMissionProvider",
          "optional": false
        },
        {
          "name": "assignee",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mission is assigned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool AssignMission(BasePlayer assignee, IMissionProvider provider, BaseMission mission)\n{\n\tif (!missionsenabled)\n\t{\n\t\treturn false;\n\t}\n\tif (!assignee.Server_CanAcceptMission(provider.ProviderID(), mission))\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanAssignMission\", assignee, mission, provider);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!server_missionInstanceValidStates.TryGetValue(new BaseMission.MissionIdentifierData(mission, provider.ProviderID()), out var value))\n\t{\n\t\treturn false;\n\t}\n\tBaseMission.MissionInstance missionInstance = null;\n\tint num = -1;\n\tfor (int i = 0; i < assignee.acceptedMissions.Count; i++)\n\t{\n\t\tBaseMission.MissionInstance missionInstance2 = assignee.acceptedMissions[i];\n\t\tif (mission.id == missionInstance2.missionID)\n\t\t{\n\t\t\tnum = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tint activeMissionIndex;\n\tif (num >= 0)\n\t{\n\t\tmissionInstance = assignee.acceptedMissions[num];\n\t\tactiveMissionIndex = num;\n\t\tmissionInstance.Reset();\n\t}\n\telse\n\t{\n\t\tmissionInstance = Facepunch.Pool.Get<BaseMission.MissionInstance>();\n\t\tactiveMissionIndex = assignee.acceptedMissions.Count;\n\t\tassignee.acceptedMissions.Add(missionInstance);\n\t}\n\tmissionInstance.missionID = mission.id;\n\tmissionInstance.startTimeUtcSeconds = System.DateTimeOffset.UtcNow.ToUnixTimeSeconds();\n\tmissionInstance.providerID = provider.ProviderID();\n\tmissionInstance.status = BaseMission.MissionStatus.Active;\n\tforeach (System.Collections.Generic.KeyValuePair<string, UnityEngine.Vector3> missionPoint in value.missionInstance.missionPoints)\n\t{\n\t\tstring key = missionPoint.Key;\n\t\tUnityEngine.Vector3 value2 = missionPoint.Value;\n\t\tmissionInstance.missionPoints.Add(key, value2);\n\t\tif (mission.TryGetPositionGenerator(key, out var positionGenerator) && positionGenerator.positionsAreExclusive)\n\t\t{\n\t\t\tAddPositionBlocker(missionInstance, value2);\n\t\t}\n\t}\n\tmission.Server_UpdateMissionValidState(provider.ProviderID(), out var _);\n\tfor (int j = 0; j < mission.objectives.Length; j++)\n\t{\n\t\tBaseMission.MissionInstance.ObjectiveStatus element = Facepunch.Pool.Get<BaseMission.MissionInstance.ObjectiveStatus>();\n\t\tmissionInstance.objectiveStatuses.Add(element);\n\t}\n\tif (missionInstance.objectiveStatuses.Count != mission.objectives.Length)\n\t{\n\t\tUnityEngine.Debug.LogError($\"New mission instance for {mission.name} has {missionInstance.objectiveStatuses.Count} objective statuses but mission has {mission.objectives.Length} objectives\", mission);\n\t}\n\tmission.MissionStart(missionInstance, assignee);\n\tassignee.SetActiveMissionIndex(activeMissionIndex);\n\tassignee.MissionsDirty(saveImmediately: true);\n\tOxide.Core.Interface.CallHook(\"OnMissionAssigned\", mission, provider, assignee);\n\treturn true;\n}\n",
      "ParametersText": "BaseMission mission, IMissionProvider provider, BasePlayer assignee",
      "TargetName": "BaseMission",
      "MethodName": "AssignMission",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 616743836,
      "Name": "OnMissionStarted",
      "FullName": "OnMissionStarted",
      "Category": "Mission",
      "Parameters": [
        {
          "name": "baseMission",
          "typeName": "BaseMission",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a mission starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void MissionStart(BaseMission.MissionInstance instance, BasePlayer assignee)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnMissionStart\", this, instance, assignee) != null)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i < objectives.Length; i++)\n\t{\n\t\tobjectives[i].Get().MissionStarted(i, instance, assignee);\n\t}\n\tif (acceptEffect.isValid)\n\t{\n\t\tDoMissionEffect(acceptEffect.resourcePath, assignee);\n\t}\n\tBaseMission.MissionEntityEntry[] array = spawnMissionEntityDefinitions;\n\tforeach (BaseMission.MissionEntityEntry missionEntityEntry in array)\n\t{\n\t\tif (missionEntityEntry.spawnOnMissionStart)\n\t\t{\n\t\t\tinstance.GetSpawnedMissionEntity(missionEntityEntry.identifier, assignee);\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnMissionStarted\", this, instance, assignee);\n}\n",
      "ParametersText": "BaseMission baseMission",
      "TargetName": "BaseMission",
      "MethodName": "MissionStart",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Naval": [
    {
      "Id": 2798657606,
      "Name": "OnEngineReverse",
      "FullName": "OnEngineReverse",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "smallEngine",
          "typeName": "SmallEngine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void SV_ToggleReverse(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEngineReverse\", this, msg.player) == null && PlayerBoat.IsPlayerAuthedOnChildEntity(this, msg.player, authedIfNoPrivOrLock: true) && PlayerBoat.IsChildOfInteractablePlayerBoat(this))\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved3, !InReverse);\n\t}\n}\n",
      "ParametersText": "SmallEngine smallEngine, BasePlayer player",
      "TargetName": "SmallEngine",
      "MethodName": "SV_ToggleReverse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1113127637,
      "Name": "OnEngineStart",
      "FullName": "OnEngineStart [SmallEngine]",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "smallEngine",
          "typeName": "SmallEngine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void TurnOn(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEngineStart\", this, msg.player) == null && fuelSystem.HasFuel() && PlayerBoat.IsPlayerAuthedOnChildEntity(this, msg.player, authedIfNoPrivOrLock: true))\n\t{\n\t\tTurnOn();\n\t}\n}\n",
      "ParametersText": "SmallEngine smallEngine, BasePlayer player",
      "TargetName": "SmallEngine",
      "MethodName": "TurnOn",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3054039405,
      "Name": "OnEngineStop",
      "FullName": "OnEngineStop [SmallEngine]",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "smallEngine",
          "typeName": "SmallEngine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void TurnOff(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEngineStop\", this, msg.player) == null && PlayerBoat.IsPlayerAuthedOnChildEntity(this, msg.player, authedIfNoPrivOrLock: true))\n\t{\n\t\tTurnOff();\n\t}\n}\n",
      "ParametersText": "SmallEngine smallEngine, BasePlayer player",
      "TargetName": "SmallEngine",
      "MethodName": "TurnOff",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3819973365,
      "Name": "CanRotateSail",
      "FullName": "CanRotateSail",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "sail",
          "typeName": "Sail",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanRotate(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanRotateSail\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (IsBusy())\n\t{\n\t\treturn false;\n\t}\n\tif (Lowered || Lowering)\n\t{\n\t\treturn false;\n\t}\n\tif (!PlayerBoat.IsPlayerAuthedOnChildEntity(this, player, authedIfNoPrivOrLock: true))\n\t{\n\t\treturn false;\n\t}\n\tDeployVolume[] volumes = PrefabAttribute.server.FindAll<DeployVolume>(prefabID);\n\treturn DeployVolume.Check(base.transform.position, base.transform.rotation * UnityEngine.Quaternion.AngleAxis(180f, UnityEngine.Vector3.up), volumes, ~(1 << base.gameObject.layer));\n}\n",
      "ParametersText": "Sail sail, BasePlayer player",
      "TargetName": "Sail",
      "MethodName": "CanRotate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 439109945,
      "Name": "CanRaiseSail",
      "FullName": "CanRaiseSail",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "sail",
          "typeName": "Sail",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanBeRaised(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanRaiseSail\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player != null && !PlayerBoat.IsPlayerAuthedOnChildEntity(this, player, authedIfNoPrivOrLock: true))\n\t{\n\t\treturn false;\n\t}\n\tif (!PlayerBoat.IsChildOfInteractablePlayerBoat(this))\n\t{\n\t\treturn false;\n\t}\n\tif (IsBusy())\n\t{\n\t\treturn false;\n\t}\n\tif (!Lowered)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "Sail sail, BasePlayer player",
      "TargetName": "Sail",
      "MethodName": "CanBeRaised",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1493169743,
      "Name": "CanLowerSail",
      "FullName": "CanLowerSail",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "sail",
          "typeName": "Sail",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanBeLowered(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanLowerSail\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (player != null && !PlayerBoat.IsPlayerAuthedOnChildEntity(this, player, authedIfNoPrivOrLock: true))\n\t{\n\t\treturn false;\n\t}\n\tif (!PlayerBoat.IsChildOfInteractablePlayerBoat(this))\n\t{\n\t\treturn false;\n\t}\n\tif (IsBusy())\n\t{\n\t\treturn false;\n\t}\n\tif (Lowered)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "Sail sail, BasePlayer player",
      "TargetName": "Sail",
      "MethodName": "CanBeLowered",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 909607648,
      "Name": "OnBoatGroupSpawn",
      "FullName": "OnBoatGroupSpawn",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "boatGroupSpawner",
          "typeName": "BoatGroupSpawner",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "UnityEngine.Vector2",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "UnityEngine.Quaternion",
          "optional": false
        },
        {
          "name": "list",
          "typeName": "System.Collections.Generic.HashSet`1[RHIB]",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.Boolean",
          "optional": false
        },
        {
          "name": "spawnsPT",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SpawnBoatGroup(BoatAI.AILoadMode loadMode = BoatAI.AILoadMode.LoadAi)\n{\n\tusing PooledHashSet<RHIB> list = Facepunch.Pool.Get<PooledHashSet<RHIB>>();\n\tSpawnBoatGroup(list, loadMode);\n}\n",
      "ParametersText": "BoatGroupSpawner boatGroupSpawner, UnityEngine.Vector2 local1, UnityEngine.Quaternion local4, System.Collections.Generic.HashSet`1[RHIB] list, bool local3, bool spawnsPT",
      "TargetName": "BoatGroupSpawner",
      "MethodName": "SpawnBoatGroup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2424062390,
      "Name": "OnBoatGroupSpawned",
      "FullName": "OnBoatGroupSpawned",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "boatGroupSpawner",
          "typeName": "BoatGroupSpawner",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "UnityEngine.Vector2",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "UnityEngine.Quaternion",
          "optional": false
        },
        {
          "name": "list",
          "typeName": "System.Collections.Generic.HashSet`1[RHIB]",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "System.Boolean",
          "optional": false
        },
        {
          "name": "spawnsPT",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SpawnBoatGroup(BoatAI.AILoadMode loadMode = BoatAI.AILoadMode.LoadAi)\n{\n\tusing PooledHashSet<RHIB> list = Facepunch.Pool.Get<PooledHashSet<RHIB>>();\n\tSpawnBoatGroup(list, loadMode);\n}\n",
      "ParametersText": "BoatGroupSpawner boatGroupSpawner, UnityEngine.Vector2 local1, UnityEngine.Quaternion local4, System.Collections.Generic.HashSet`1[RHIB] list, bool local3, bool spawnsPT",
      "TargetName": "BoatGroupSpawner",
      "MethodName": "SpawnBoatGroup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2424062390,
      "Name": "OnBoatGroupSpawned",
      "FullName": "OnBoatGroupSpawned [Patch]",
      "Category": "Naval",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SpawnBoatGroup(BoatAI.AILoadMode loadMode = BoatAI.AILoadMode.LoadAi)\n{\n\tusing PooledHashSet<RHIB> list = Facepunch.Pool.Get<PooledHashSet<RHIB>>();\n\tSpawnBoatGroup(list, loadMode);\n}\n",
      "ParametersText": "",
      "TargetName": "BoatGroupSpawner",
      "MethodName": "SpawnBoatGroup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1355776107,
      "Name": "OnDeepSeaTeleport",
      "FullName": "OnDeepSeaTeleport",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "triggerDeepSeaPortal",
          "typeName": "TriggerDeepSeaPortal",
          "optional": false
        },
        {
          "name": "ent",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal override void OnEntityEnter(BaseEntity ent)\n{\n\tbase.OnEntityEnter(ent);\n\tif (ent.isClient || Portal.isClient)\n\t{\n\t\treturn;\n\t}\n\tDeepSeaManager serverInstance = PointEntity<DeepSeaManager>.ServerInstance;\n\tif (serverInstance == null || !serverInstance.IsOpen() || (Portal.PortalMode == DeepSeaPortal.PortalModeEnum.Entrance && !Portal.HasFlag(BaseEntity.Flags.Open)))\n\t{\n\t\treturn;\n\t}\n\tif (ent is BoatBuildingBlock boatBuildingBlock && boatBuildingBlock.GetParentEntity() != null)\n\t{\n\t\tent = boatBuildingBlock.GetParentEntity();\n\t}\n\tvar (flag, phrase) = CanEntityTeleport(ent);\n\tif (!flag)\n\t{\n\t\tif (!ShowToasts || phrase == null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (ent is BasePlayer basePlayer)\n\t\t{\n\t\t\tbasePlayer.ShowToast(GameTip.Styles.Blue_Long, phrase, false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (!(ent is BaseVehicle entity))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tSystem.Collections.Generic.List<BasePlayer> obj = Facepunch.Pool.Get<System.Collections.Generic.List<BasePlayer>>();\n\t\t\tBaseVehicle.GetPassengersForVehicle(entity, obj);\n\t\t\tforeach (BasePlayer item in obj)\n\t\t\t{\n\t\t\t\titem.ShowToast(GameTip.Styles.Blue_Long, phrase, false);\n\t\t\t}\n\t\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!WillTeleport || Oxide.Core.Interface.CallHook(\"OnDeepSeaTeleport\", this, ent) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (Portal.PortalMode == DeepSeaPortal.PortalModeEnum.Entrance)\n\t\t{\n\t\t\tLeTai.ExtensionMethods.NextFrames(Portal, delegate\n\t\t\t{\n\t\t\t\tPointEntity<DeepSeaManager>.ServerInstance.MoveToDeepSea(ent);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tLeTai.ExtensionMethods.NextFrames(Portal, delegate\n\t\t\t{\n\t\t\t\tPointEntity<DeepSeaManager>.ServerInstance.MoveToMainIsland(ent);\n\t\t\t});\n\t\t}\n\t}\n}\n",
      "ParametersText": "TriggerDeepSeaPortal triggerDeepSeaPortal, BaseEntity ent",
      "TargetName": "TriggerDeepSeaPortal",
      "MethodName": "OnEntityEnter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4288677601,
      "Name": "CanTeleportDeepSea",
      "FullName": "CanTeleportDeepSea",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "entity",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "triggerDeepSeaPortal",
          "typeName": "TriggerDeepSeaPortal",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private (bool, Translate.Phrase) CanEntityTeleport(BaseEntity entity)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanTeleportDeepSea\", entity, Portal);\n\tif (obj is System.ValueTuple<bool, Translate.Phrase>)\n\t{\n\t\treturn ((bool, Translate.Phrase))obj;\n\t}\n\tif (Portal.PortalMode == DeepSeaPortal.PortalModeEnum.Entrance)\n\t{\n\t\treturn DeepSeaManager.CanTeleportToDeepSea(entity);\n\t}\n\tif (Portal.PortalMode == DeepSeaPortal.PortalModeEnum.Exit)\n\t{\n\t\treturn DeepSeaManager.CanTeleportToMainIsland(entity);\n\t}\n\treturn (false, null);\n}\n",
      "ParametersText": "BaseEntity entity, TriggerDeepSeaPortal triggerDeepSeaPortal",
      "TargetName": "TriggerDeepSeaPortal",
      "MethodName": "CanEntityTeleport",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "System.ValueTuple`2[[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Translate.Phrase, Rust.Localization, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"
    },
    {
      "Id": 1935391534,
      "Name": "CanLightCannonFuse",
      "FullName": "CanLightCannonFuse",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "cannon",
          "typeName": "Cannon",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool CanLightFuse()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanLightCannonFuse\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn !HasFlag(BaseEntity.Flags.Reserved6);\n}\n",
      "ParametersText": "Cannon cannon",
      "TargetName": "Cannon",
      "MethodName": "CanLightFuse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2449028929,
      "Name": "OnPlayerBoatCollide",
      "FullName": "OnPlayerBoatCollide",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "playerBoat",
          "typeName": "PlayerBoat",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "collision",
          "typeName": "UnityEngine.Collision",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void ProcessCollision(UnityEngine.Collision collision)\n{\n\tif (!base.isClient && collision != null && !(collision.gameObject == null) && !(collision.gameObject == null))\n\t{\n\t\tBaseEntity baseEntity = UnityEngine.GameObjectEx.ToBaseEntity(collision.gameObject);\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPlayerBoatCollide\", this, baseEntity, collision) == null && baseEntity != null && !baseEntity.isClient && baseEntity is IDestroyableOnPlayerBoatCollision destroyableOnPlayerBoatCollision && destroyableOnPlayerBoatCollision.ShouldBeDestroyedBy(this))\n\t\t{\n\t\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PlayerBoat playerBoat, BaseEntity local0, UnityEngine.Collision collision",
      "TargetName": "PlayerBoat",
      "MethodName": "ProcessCollision",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1618730577,
      "Name": "CanEditPlayerBoat",
      "FullName": "CanEditPlayerBoat",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "playerBoat",
          "typeName": "PlayerBoat",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanStartEditing(BasePlayer player, bool sendErrorToasts)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanEditPlayerBoat\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (IsDying)\n\t{\n\t\treturn false;\n\t}\n\tif (base.isServer && rigidBody.velocity.magnitude >= MaxEditVelocity)\n\t{\n\t\tif (sendErrorToasts)\n\t\t{\n\t\t\tplayer.ShowToast(GameTip.Styles.Error, tooFastToEditErrorPhrase, false);\n\t\t}\n\t\treturn false;\n\t}\n\tif (IsOnDamagedCoolDown())\n\t{\n\t\tif (base.isServer && sendErrorToasts)\n\t\t{\n\t\t\tplayer.ShowToast(GameTip.Styles.Error, recentlyDamagedCantEditPhrase, false);\n\t\t}\n\t\treturn false;\n\t}\n\tif (!IsPlayerAuthed(player, authedIfNoPriveOrLock: true))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "PlayerBoat playerBoat, BasePlayer player",
      "TargetName": "PlayerBoat",
      "MethodName": "CanStartEditing",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 565264246,
      "Name": "OnDeepSeaClosed",
      "FullName": "OnDeepSeaClosed",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "DeepSeaManager",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "DeepSeaManager local1",
      "TargetName": "DeepSeaManager/<CloseDeepSeaAsync>d__119",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1501492042,
      "Name": "OnDeepSeaClose",
      "FullName": "OnDeepSeaClose",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "DeepSeaManager",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "DeepSeaManager local1",
      "TargetName": "DeepSeaManager/<CloseDeepSeaAsync>d__119",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 631225454,
      "Name": "OnDeepSeaOpened",
      "FullName": "OnDeepSeaOpened",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "DeepSeaManager",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "DeepSeaManager local1",
      "TargetName": "DeepSeaManager/<OpenDeepSeaAsync>d__117",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4076046452,
      "Name": "OnDeepSeaOpen",
      "FullName": "OnDeepSeaOpen",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "DeepSeaManager",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "DeepSeaManager local1",
      "TargetName": "DeepSeaManager/<OpenDeepSeaAsync>d__117",
      "MethodName": "MoveNext",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2230452787,
      "Name": "OnPlayerBoatEditStarted",
      "FullName": "OnPlayerBoatEditStarted",
      "Category": "Naval",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "PlayerBoat",
          "optional": false
        },
        {
          "name": "boatBuildingStation",
          "typeName": "BoatBuildingStation",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void ConvertPlayerBoatToConstruction()\n{\n\tSystem.Collections.Generic.List<PlayerBoat> obj = GetPlayerBoats();\n\tif (obj.Count != 1)\n\t{\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\treturn;\n\t}\n\tPlayerBoat playerBoat = obj[0];\n\tcachedSteeringWheel = playerBoat.GetSteeringWheel();\n\tplayerBoat.PowerDown(force: true);\n\tplayerBoat.rigidBody.isKinematic = true;\n\tUnityEngine.Object.Destroy(playerBoat.rigidBody);\n\tbool autoSyncTransforms = UnityEngine.Physics.autoSyncTransforms;\n\ttry\n\t{\n\t\tUnityEngine.Physics.autoSyncTransforms = false;\n\t\tplayerBoat.transform.position = UnityEngine.Vector3Ex.WithY(playerBoat.transform.position, 0f);\n\t\tplayerBoat.transform.localEulerAngles = new UnityEngine.Vector3(0f, playerBoat.transform.localEulerAngles.y, 0f);\n\t\tplayerBoat.SendNetworkUpdate();\n\t\tplayerBoat.DistributeHealthAcrossBlocks();\n\t\tplayerBoat.SwitchToConstruction();\n\t\tplayerBoat.KilledForEditMode = true;\n\t\tplayerBoat.OrphanChildEntities();\n\t}\n\tfinally\n\t{\n\t\tif (autoSyncTransforms)\n\t\t{\n\t\t\tUnityEngine.Physics.SyncTransforms();\n\t\t}\n\t\tUnityEngine.Physics.autoSyncTransforms = autoSyncTransforms;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnPlayerBoatEditStarted\", playerBoat, this);\n\tplayerBoat.Kill();\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n}\n",
      "ParametersText": "PlayerBoat local1, BoatBuildingStation boatBuildingStation",
      "TargetName": "BoatBuildingStation",
      "MethodName": "ConvertPlayerBoatToConstruction",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Network": [
    {
      "Id": 1622751857,
      "Name": "CanNetworkTo",
      "FullName": "CanNetworkTo",
      "Category": "Network",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to network to.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool ShouldNetworkTo(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanNetworkTo\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (net.group == null)\n\t{\n\t\treturn true;\n\t}\n\treturn player.net.subscriber.IsSubscribed(net.group);\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "ShouldNetworkTo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2439782111,
      "Name": "OnNetworkGroupEntered",
      "FullName": "OnNetworkGroupEntered",
      "Category": "Network",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a network group is entered."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnNetworkGroupEnter(Network.Visibility.Group group)\n{\n\tOxide.Core.Interface.CallHook(\"OnNetworkGroupEntered\", this, group);\n\tif (ServerOcclusion.OcclusionEnabled && SupportsServerOcclusion())\n\t{\n\t\tOcclusionSubscribedTo(group);\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "OnNetworkGroupEnter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 226983605,
      "Name": "OnNetworkGroupLeft",
      "FullName": "OnNetworkGroupLeft",
      "Category": "Network",
      "Parameters": [
        {
          "name": "baseNetworkable",
          "typeName": "BaseNetworkable",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when network group left occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void OnNetworkGroupLeave(Network.Visibility.Group group)\n{\n\tOxide.Core.Interface.CallHook(\"OnNetworkGroupLeft\", this, group);\n\tif (ServerOcclusion.OcclusionEnabled && SupportsServerOcclusion())\n\t{\n\t\tOcclusionUnsubscribedFrom(group);\n\t}\n}\n",
      "ParametersText": "BaseNetworkable baseNetworkable",
      "TargetName": "BaseNetworkable",
      "MethodName": "OnNetworkGroupLeave",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 26233677,
      "Name": "OnNetworkSubscriptionsGather",
      "FullName": "OnNetworkSubscriptionsGather",
      "Category": "Network",
      "Parameters": [
        {
          "name": "networkVisibilityGrid",
          "typeName": "NetworkVisibilityGrid",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a network subscriptions gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "#define UNITY_ASSERTIONS\npublic void GetVisibleFrom(Network.Visibility.Group group, ListHashSet<Network.Visibility.Group> groups, int radius)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnNetworkSubscriptionsGather\", this, group, groups, radius) != null)\n\t{\n\t\treturn;\n\t}\n\tListHashSet<Network.Visibility.Group> groups2 = groups;\n\tGetGlobalNetworkGroups(group, groups2);\n\tif (group.restricted)\n\t{\n\t\tgroups2.Add(group);\n\t\treturn;\n\t}\n\tint iD = (int)group.ID;\n\tif (iD >= startID)\n\t{\n\t\t(int x, int y, int layer) tuple = DeconstructGroupId(iD);\n\t\tint item = tuple.x;\n\t\tint item2 = tuple.y;\n\t\tint item3 = tuple.layer;\n\t\tNetworkVisibilityGrid.Layer layer = _layers[item3];\n\t\tUnityEngine.Assertions.Assert.IsNotNull(layer, \"layer != null\");\n\t\tif (item3 == 0 || item3 == 1 || item3 == 2)\n\t\t{\n\t\t\tAddLayer(layer, item, item2, 0, radius);\n\t\t\tAddLayer(layer, item, item2, 1, radius);\n\t\t\tAddLayer(layer, item, item2, 2, radius);\n\t\t\tAddLayer(layer, item, item2, 3, radius / 2);\n\t\t}\n\t\tif (item3 == 3)\n\t\t{\n\t\t\tAddLayer(layer, item, item2, 3, radius);\n\t\t\tAddLayer(layer, item, item2, 0, radius / 2);\n\t\t\tAddLayer(layer, item, item2, 1, radius / 2);\n\t\t\tAddLayer(layer, item, item2, 2, radius / 2);\n\t\t\tAddLayer(layer, item, item2, 4, radius / 2);\n\t\t}\n\t\tif (item3 == 4)\n\t\t{\n\t\t\tAddLayer(layer, item, item2, 4, radius);\n\t\t\tAddLayer(layer, item, item2, 3, radius / 2);\n\t\t}\n\t\tif (item3 == 5)\n\t\t{\n\t\t\tAddLayer(layer, item, item2, 5, radius);\n\t\t}\n\t\tUnityEngine.Assertions.Assert.IsTrue(groups2.Count > 0, \"groups.Count > 0\");\n\t}\n\tvoid AddLayer(NetworkVisibilityGrid.Layer sourceLayer, int sourceX, int sourceY, int targetLayerIdx, int targetLayerRadius)\n\t{\n\t\tvar (layer2, vector2i) = ConvertLayerCoords(sourceLayer, sourceX, sourceY, targetLayerIdx);\n\t\tforeach (Vector2i value in GetTileOffsets(targetLayerRadius).Values)\n\t\t{\n\t\t\tVector2i vector2i2 = vector2i + value;\n\t\t\tif (vector2i2.x >= 0 && vector2i2.x < layer2.CellCount && vector2i2.y >= 0 && vector2i2.y < layer2.CellCount)\n\t\t\t{\n\t\t\t\tNetwork.Visibility.Group orCreateFromLayer = GetOrCreateFromLayer(vector2i2.x, vector2i2.y, layer2);\n\t\t\t\tgroups2.Add(orCreateFromLayer);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "NetworkVisibilityGrid networkVisibilityGrid",
      "TargetName": "NetworkVisibilityGrid",
      "MethodName": "GetVisibleFrom",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2205571767,
      "Name": "OnNetworkSubscriptionsUpdate",
      "FullName": "OnNetworkSubscriptionsUpdate",
      "Category": "Network",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a network subscriptions is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool UpdateSubscriptions(int removeLimit, int addLimit)\n{\n\tif (!ShouldUpdateSubscriptions)\n\t{\n\t\treturn false;\n\t}\n\tusing (TimeWarning.New(\"UpdateSubscriptions\"))\n\t{\n\t\tupdateSubscriptions = false;\n\t\tSystem.Collections.Generic.List<Network.Visibility.Group> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Network.Visibility.Group>>();\n\t\tSystem.Collections.Generic.List<Network.Visibility.Group> obj2 = Facepunch.Pool.Get<System.Collections.Generic.List<Network.Visibility.Group>>();\n\t\tListHashSet<Network.Visibility.Group> obj3 = Facepunch.Pool.Get<ListHashSet<Network.Visibility.Group>>();\n\t\tSubStrategy.GatherSubscriptions(this, obj3);\n\t\tListHashSet<Network.Visibility.Group>.Compare(subscriber.subscribed, obj3, obj, obj2, null);\n\t\tif (Oxide.Core.Interface.CallHook(\"OnNetworkSubscriptionsUpdate\", this, obj, obj2) == null)\n\t\t{\n\t\t\tfor (int i = 0; i < obj2.Count; i++)\n\t\t\t{\n\t\t\t\tNetwork.Visibility.Group group = obj2[i];\n\t\t\t\tif (removeLimit > 0)\n\t\t\t\t{\n\t\t\t\t\tsubscriber.Unsubscribe(group);\n\t\t\t\t\tif (handler != null)\n\t\t\t\t\t{\n\t\t\t\t\t\thandler.OnNetworkGroupLeave(group);\n\t\t\t\t\t}\n\t\t\t\t\tremoveLimit -= group.networkables?.Count ?? 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tupdateSubscriptions = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int j = 0; j < obj.Count; j++)\n\t\t\t{\n\t\t\t\tNetwork.Visibility.Group group2 = obj[j];\n\t\t\t\tif (addLimit > 0)\n\t\t\t\t{\n\t\t\t\t\tsubscriber.Subscribe(group2);\n\t\t\t\t\tif (handler != null)\n\t\t\t\t\t{\n\t\t\t\t\t\thandler.OnNetworkGroupEnter(group2);\n\t\t\t\t\t}\n\t\t\t\t\taddLimit -= group2.networkables?.Count ?? 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tupdateSubscriptions = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj3);\n\t}\n\treturn true;\n}\n",
      "ParametersText": "",
      "TargetName": "Network.Networkable",
      "MethodName": "UpdateSubscriptions",
      "AssemblyName": "Facepunch.Network",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2205571767,
      "Name": "OnNetworkSubscriptionsUpdate",
      "FullName": "OnNetworkSubscriptionsUpdate [2]",
      "Category": "Network",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a network subscriptions is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool UpdateHighPrioritySubscriptions()\n{\n\tif (subscriber == null)\n\t{\n\t\treturn false;\n\t}\n\tusing (TimeWarning.New(\"UpdateHighPrioritySubscriptions\"))\n\t{\n\t\tSystem.Collections.Generic.List<Network.Visibility.Group> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Network.Visibility.Group>>();\n\t\tListHashSet<Network.Visibility.Group> obj2 = Facepunch.Pool.Get<ListHashSet<Network.Visibility.Group>>();\n\t\tSubStrategy.GatherHighPrioSubscriptions(this, obj2);\n\t\tListHashSet<Network.Visibility.Group>.Compare(subscriber.subscribed, obj2, obj, null, null);\n\t\tif (Oxide.Core.Interface.CallHook(\"OnNetworkSubscriptionsUpdate\", this, obj, null) == null)\n\t\t{\n\t\t\tfor (int i = 0; i < obj.Count; i++)\n\t\t\t{\n\t\t\t\tNetwork.Visibility.Group group = obj[i];\n\t\t\t\tsubscriber.Subscribe(group);\n\t\t\t\tif (handler != null && group.HasSubscribers())\n\t\t\t\t{\n\t\t\t\t\thandler.OnNetworkGroupEnter(group);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\t\tFacepunch.Pool.FreeUnmanaged(ref obj2);\n\t}\n\treturn true;\n}\n",
      "ParametersText": "",
      "TargetName": "Network.Networkable",
      "MethodName": "UpdateHighPrioritySubscriptions",
      "AssemblyName": "Facepunch.Network",
      "ReturnTypeName": "void"
    }
  ],
  "NPC": [
    {
      "Id": 3166826695,
      "Name": "CanNpcEat",
      "FullName": "CanNpcEat [BaseNpc]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "baseNpc",
          "typeName": "BaseNpc",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to npc eat.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool WantsToEat(BaseEntity best)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanNpcEat\", this, best);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!best.HasTrait(BaseEntity.TraitFlag.Food))\n\t{\n\t\treturn false;\n\t}\n\tif (best.HasTrait(BaseEntity.TraitFlag.Alive))\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BaseNpc baseNpc",
      "TargetName": "BaseNpc",
      "MethodName": "WantsToEat",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2741067381,
      "Name": "OnNpcAttack",
      "FullName": "OnNpcAttack [BaseNpc]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "baseNpc",
          "typeName": "BaseNpc",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BaseNpc",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an npc attacks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void StartAttack()\n{\n\tif ((bool)AttackTarget && AttackReady() && Oxide.Core.Interface.CallHook(\"OnNpcAttack\", this, AttackTarget) == null && !((AttackTarget.ServerPosition - ServerPosition).magnitude > AttackRange))\n\t{\n\t\tnextAttackTime = UnityEngine.Time.realtimeSinceStartup + AttackRate;\n\t\tBaseCombatEntity combatTarget = CombatTarget;\n\t\tif ((bool)combatTarget)\n\t\t{\n\t\t\tcombatTarget.Hurt(AttackDamage, AttackDamageType, this);\n\t\t\tStamina.Use(AttackCost);\n\t\t\tBusyTimer.Activate(0.5f);\n\t\t\tSignalBroadcast(BaseEntity.Signal.Attack);\n\t\t\tClientRPC(RpcTarget.NetworkGroup(\"Attack\"), AttackTarget.ServerPosition);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BaseNpc baseNpc, BaseNpc self1",
      "TargetName": "BaseNpc",
      "MethodName": "StartAttack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 650484908,
      "Name": "OnNpcGiveSoldItem",
      "FullName": "OnNpcGiveSoldItem",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCVendingMachine",
          "typeName": "NPCVendingMachine",
          "optional": false
        },
        {
          "name": "soldItem",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "buyer",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc give sold item occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void GiveSoldItem(Item soldItem, BasePlayer buyer)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnNpcGiveSoldItem\", this, soldItem, buyer) == null)\n\t{\n\t\tsoldItem.SetItemOwnership(buyer, ItemOwnershipPhrases.VendorSale);\n\t\tbase.GiveSoldItem(soldItem, buyer);\n\t}\n}\n",
      "ParametersText": "NPCVendingMachine nPCVendingMachine, Item soldItem, BasePlayer buyer",
      "TargetName": "NPCVendingMachine",
      "MethodName": "GiveSoldItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2231963737,
      "Name": "OnNpcRadioChatter",
      "FullName": "OnNpcRadioChatter [ScientistNPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "scientistNPC",
          "typeName": "ScientistNPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc radio chatter occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PlayRadioChatter()\n{\n\tif (RadioChatterEffects.Length != 0)\n\t{\n\t\tif (base.IsDestroyed || base.transform == null)\n\t\t{\n\t\t\tCancelInvoke(PlayRadioChatter);\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnNpcRadioChatter\", this) == null)\n\t\t{\n\t\t\tEffect.server.Run(RadioChatterEffects[UnityEngine.Random.Range(0, RadioChatterEffects.Length)].resourcePath, this, StringPool.Get(\"head\"), UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t\tQueueRadioChatter();\n\t\t}\n\t}\n}\n",
      "ParametersText": "ScientistNPC scientistNPC",
      "TargetName": "ScientistNPC",
      "MethodName": "PlayRadioChatter",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2436309797,
      "Name": "OnNpcAlert",
      "FullName": "OnNpcAlert [ScientistNPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "scientistNPC",
          "typeName": "ScientistNPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc alert occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Alert()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnNpcAlert\", this) == null)\n\t{\n\t\tlastAlertedTime = UnityEngine.Time.time;\n\t\tSetChatterType(ScientistNPC.RadioChatterType.Alert);\n\t}\n}\n",
      "ParametersText": "ScientistNPC scientistNPC",
      "TargetName": "ScientistNPC",
      "MethodName": "Alert",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 92399643,
      "Name": "OnNpcEquipWeapon",
      "FullName": "OnNpcEquipWeapon [ScientistNPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "scientistNPC",
          "typeName": "ScientistNPC",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc equip weapon occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void EquipWeapon(bool skipDeployDelay = false)\n{\n\tbase.EquipWeapon(skipDeployDelay);\n\tHeldEntity heldEntity = GetHeldEntity();\n\tif (!(heldEntity != null))\n\t{\n\t\treturn;\n\t}\n\tItem item = heldEntity.GetItem();\n\tif (item == null || item.contents == null || Oxide.Core.Interface.CallHook(\"OnNpcEquipWeapon\", this, item) != null)\n\t{\n\t\treturn;\n\t}\n\tif (UnityEngine.Random.Range(0, 3) == 0)\n\t{\n\t\tItem item2 = ItemManager.CreateByName(\"weapon.mod.flashlight\", 1, 0uL);\n\t\tif (!item2.MoveToContainer(item.contents))\n\t\t{\n\t\t\titem2.Remove();\n\t\t\treturn;\n\t\t}\n\t\tlightsOn = false;\n\t\tInvokeRandomized(base.LightCheck, 0f, 30f, 5f);\n\t\tLightCheck();\n\t}\n\telse\n\t{\n\t\tItem item3 = ItemManager.CreateByName(\"weapon.mod.lasersight\", 1, 0uL);\n\t\tif (!item3.MoveToContainer(item.contents))\n\t\t{\n\t\t\titem3.Remove();\n\t\t}\n\t\tLightToggle();\n\t\tlightsOn = true;\n\t}\n}\n",
      "ParametersText": "ScientistNPC scientistNPC, Item local1",
      "TargetName": "ScientistNPC",
      "MethodName": "EquipWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 92399643,
      "Name": "OnNpcEquipWeapon",
      "FullName": "OnNpcEquipWeapon [NPCPlayer]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCPlayer",
          "typeName": "NPCPlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc equip weapon occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void EquipWeapon(bool skipDeployDelay = false)\n{\n\tif (base.inventory == null || base.inventory.containerBelt == null)\n\t{\n\t\treturn;\n\t}\n\tItem slot = base.inventory.containerBelt.GetSlot(0);\n\tif (Oxide.Core.Interface.CallHook(\"OnNpcEquipWeapon\", this, slot) != null || slot == null)\n\t{\n\t\treturn;\n\t}\n\tUpdateActiveItem(base.inventory.containerBelt.GetSlot(0).uid);\n\tBaseEntity heldEntity = slot.GetHeldEntity();\n\tif (!(heldEntity != null))\n\t{\n\t\treturn;\n\t}\n\tAttackEntity component = heldEntity.GetComponent<AttackEntity>();\n\tif (component != null)\n\t{\n\t\tif (skipDeployDelay)\n\t\t{\n\t\t\tcomponent.ResetAttackCooldown();\n\t\t}\n\t\tcomponent.TopUpAmmo();\n\t}\n}\n",
      "ParametersText": "NPCPlayer nPCPlayer, Item local0",
      "TargetName": "NPCPlayer",
      "MethodName": "EquipWeapon",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 338615359,
      "Name": "OnCorpsePopulate",
      "FullName": "OnCorpsePopulate",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCPlayer",
          "typeName": "NPCPlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "NPCPlayerCorpse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when corpse populate occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override BaseCorpse CreateCorpse(BasePlayer.PlayerFlags flagsOnDeath, UnityEngine.Vector3 posOnDeath, UnityEngine.Quaternion rotOnDeath, System.Collections.Generic.List<TriggerBase> triggersOnDeath, bool forceServerSide = false)\n{\n\tusing (TimeWarning.New(\"Create corpse\"))\n\t{\n\t\tNPCPlayerCorpse nPCPlayerCorpse = DropCorpse(CorpsePath, flagsOnDeath, modelState) as NPCPlayerCorpse;\n\t\tif ((bool)nPCPlayerCorpse)\n\t\t{\n\t\t\tif (NavAgent != null)\n\t\t\t{\n\t\t\t\tnPCPlayerCorpse.transform.position += UnityEngine.Vector3.down * NavAgent.baseOffset;\n\t\t\t}\n\t\t\tnPCPlayerCorpse.SetLootableIn(2f);\n\t\t\tnPCPlayerCorpse.SetFlag(BaseEntity.Flags.Reserved5, HasPlayerFlag(BasePlayer.PlayerFlags.DisplaySash));\n\t\t\tnPCPlayerCorpse.SetFlag(BaseEntity.Flags.Reserved2, b: true);\n\t\t\tif (CopyInventoryToCorpse)\n\t\t\t{\n\t\t\t\tnPCPlayerCorpse.TakeFrom(this, base.inventory.containerMain, base.inventory.containerWear, base.inventory.containerBelt);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnPCPlayerCorpse.CreateEmptyContainer(base.inventory.containerMain.capacity);\n\t\t\t}\n\t\t\tnPCPlayerCorpse.playerName = OverrideCorpseName;\n\t\t\tnPCPlayerCorpse.playerSteamID = userID;\n\t\t\tnPCPlayerCorpse.Spawn();\n\t\t\tif (ShouldCorpseTakeChildren)\n\t\t\t{\n\t\t\t\tnPCPlayerCorpse.TakeChildren(this);\n\t\t\t}\n\t\t\tfor (int i = 0; i < nPCPlayerCorpse.containers.Length; i++)\n\t\t\t{\n\t\t\t\tItemContainer itemContainer = nPCPlayerCorpse.containers[i];\n\t\t\t\tif (!KeepCorpseClothingIntact || i != 1)\n\t\t\t\t{\n\t\t\t\t\titemContainer.Clear();\n\t\t\t\t}\n\t\t\t}\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnCorpsePopulate\", this, nPCPlayerCorpse);\n\t\t\tif (obj is BaseCorpse)\n\t\t\t{\n\t\t\t\treturn (BaseCorpse)obj;\n\t\t\t}\n\t\t\tApplyLoot(nPCPlayerCorpse);\n\t\t}\n\t\treturn nPCPlayerCorpse;\n\t}\n}\n",
      "ParametersText": "NPCPlayer nPCPlayer, NPCPlayerCorpse local1",
      "TargetName": "NPCPlayer",
      "MethodName": "CreateCorpse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "BaseCorpse"
    },
    {
      "Id": 120484519,
      "Name": "OnNpcDuck",
      "FullName": "OnNpcDuck [HumanNPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "humanNPC",
          "typeName": "HumanNPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc duck occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetDucked(bool flag)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnNpcDuck\", this) == null)\n\t{\n\t\tmodelState.ducked = flag;\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "HumanNPC humanNPC",
      "TargetName": "HumanNPC",
      "MethodName": "SetDucked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1066895325,
      "Name": "OnNpcTarget",
      "FullName": "OnNpcTarget [HumanNPC]",
      "Category": "NPC",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when npc target occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public BaseEntity GetBestTarget()\n{\n\tBaseEntity result = null;\n\tfloat num = -1f;\n\tforeach (BaseEntity player in Brain.Senses.Players)\n\t{\n\t\tif (!(player == null) && !(player.Health() <= 0f) && Oxide.Core.Interface.CallHook(\"OnNpcTarget\", this, player) == null)\n\t\t{\n\t\t\tfloat value = UnityEngine.Vector3.Distance(player.transform.position, base.transform.position);\n\t\t\tfloat num2 = 1f - UnityEngine.Mathf.InverseLerp(1f, Brain.SenseRange, value);\n\t\t\tfloat value2 = UnityEngine.Vector3.Dot((player.transform.position - base.eyes.position).normalized, base.eyes.BodyForward());\n\t\t\tnum2 += UnityEngine.Mathf.InverseLerp(Brain.VisionCone, 1f, value2) / 2f;\n\t\t\tnum2 += (Brain.Senses.Memory.IsLOS(player) ? 2f : 0f);\n\t\t\tif (num2 > num)\n\t\t\t{\n\t\t\t\tresult = player;\n\t\t\t\tnum = num2;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n",
      "ParametersText": "",
      "TargetName": "HumanNPC",
      "MethodName": "GetBestTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1580074841,
      "Name": "OnNpcConversationRespond",
      "FullName": "OnNpcConversationRespond",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCTalking",
          "typeName": "NPCTalking",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "ConversationData",
          "optional": false
        },
        {
          "name": "local17",
          "typeName": "ConversationData+ResponseNode",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc conversation respond occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void Server_ResponsePressed(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tint num = msg.read.Int32();\n\tint num2 = msg.read.Int32();\n\tuint missionId = msg.read.UInt32();\n\tuint missionId2 = msg.read.UInt32();\n\tConversationData conversationFor = GetConversationFor(player);\n\tif (conversationFor == null)\n\t{\n\t\treturn;\n\t}\n\tConversationData.AbstractSpeechNodeData abstractSpeechNodeData = conversationFor.speechNodes[num];\n\tstring guid = string.Empty;\n\tIMissionProvider missionProvider = this as IMissionProvider;\n\tConversationData.ResponseNode responseNode = default(ConversationData.ResponseNode);\n\tif (abstractSpeechNodeData is ConversationData.MissionListSpeechNodeData missionListSpeechNodeData)\n\t{\n\t\tif (!(this is NPCSimpleMissionProvider) || missionProvider == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(string.Format(\"Response {0} pressed on mission list speech node on {1} but is not a {2}\", num2, base.name, \"NPCSimpleMissionProvider\"));\n\t\t\treturn;\n\t\t}\n\t\tif (missionProvider.TryGetMission(missionId2, out var mission))\n\t\t{\n\t\t\tbool flag = false;\n\t\t\tConversationData.MissionListNodeOptionData[] resultingNodeOptions = missionListSpeechNodeData.resultingNodeOptions;\n\t\t\tforeach (ConversationData.MissionListNodeOptionData missionListNodeOptionData in resultingNodeOptions)\n\t\t\t{\n\t\t\t\tif (!(missionListNodeOptionData.selectedMission != mission))\n\t\t\t\t{\n\t\t\t\t\tguid = missionListNodeOptionData.resultingNode;\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!flag)\n\t\t\t{\n\t\t\t\tguid = missionListSpeechNodeData.defaultResultingNode;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (abstractSpeechNodeData is ConversationData.MissionPreviewSpeechNodeData && this is NPCSimpleMissionProvider && num2 == 0 && missionProvider != null && missionProvider.TryGetMission(missionId, out var mission2) && player.Server_CanAcceptMission(missionProvider, mission2))\n\t\t{\n\t\t\tTryAssignMissionToPlayer(mission2, player);\n\t\t}\n\t\tresponseNode = abstractSpeechNodeData.responses[num2];\n\t\tif (responseNode != null)\n\t\t{\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnNpcConversationRespond\", this, player, conversationFor, responseNode) != null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (responseNode.conditions.Length != 0)\n\t\t\t{\n\t\t\t\tUpdateFlags();\n\t\t\t}\n\t\t\tbool num3 = responseNode.PassesConditions(player, this);\n\t\t\tif (num3)\n\t\t\t{\n\t\t\t\tstring actionString = responseNode.GetActionString();\n\t\t\t\tif (!string.IsNullOrEmpty(actionString))\n\t\t\t\t{\n\t\t\t\t\tOnConversationAction(player, actionString);\n\t\t\t\t}\n\t\t\t}\n\t\t\tguid = (num3 ? responseNode.resultingSpeechNode : responseNode.GetFailedSpeechNode(player, this));\n\t\t}\n\t}\n\tconversationFor.GetFirstSpeechNodeFrom(player, this, guid, out var nodeIndex);\n\tif (nodeIndex == -1)\n\t{\n\t\tForceEndConversation(player);\n\t\treturn;\n\t}\n\tForceSpeechNode(player, conversationFor, nodeIndex);\n\tOxide.Core.Interface.CallHook(\"OnNpcConversationResponded\", this, player, conversationFor, responseNode);\n}\n",
      "ParametersText": "NPCTalking nPCTalking, BasePlayer local0, ConversationData local5, ConversationData.ResponseNode local17",
      "TargetName": "NPCTalking",
      "MethodName": "Server_ResponsePressed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2723808568,
      "Name": "OnNpcConversationResponded",
      "FullName": "OnNpcConversationResponded",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCTalking",
          "typeName": "NPCTalking",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "ConversationData",
          "optional": false
        },
        {
          "name": "local17",
          "typeName": "ConversationData+ResponseNode",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an npc conversation is responded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(5uL)]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void Server_ResponsePressed(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tint num = msg.read.Int32();\n\tint num2 = msg.read.Int32();\n\tuint missionId = msg.read.UInt32();\n\tuint missionId2 = msg.read.UInt32();\n\tConversationData conversationFor = GetConversationFor(player);\n\tif (conversationFor == null)\n\t{\n\t\treturn;\n\t}\n\tConversationData.AbstractSpeechNodeData abstractSpeechNodeData = conversationFor.speechNodes[num];\n\tstring guid = string.Empty;\n\tIMissionProvider missionProvider = this as IMissionProvider;\n\tConversationData.ResponseNode responseNode = default(ConversationData.ResponseNode);\n\tif (abstractSpeechNodeData is ConversationData.MissionListSpeechNodeData missionListSpeechNodeData)\n\t{\n\t\tif (!(this is NPCSimpleMissionProvider) || missionProvider == null)\n\t\t{\n\t\t\tUnityEngine.Debug.LogError(string.Format(\"Response {0} pressed on mission list speech node on {1} but is not a {2}\", num2, base.name, \"NPCSimpleMissionProvider\"));\n\t\t\treturn;\n\t\t}\n\t\tif (missionProvider.TryGetMission(missionId2, out var mission))\n\t\t{\n\t\t\tbool flag = false;\n\t\t\tConversationData.MissionListNodeOptionData[] resultingNodeOptions = missionListSpeechNodeData.resultingNodeOptions;\n\t\t\tforeach (ConversationData.MissionListNodeOptionData missionListNodeOptionData in resultingNodeOptions)\n\t\t\t{\n\t\t\t\tif (!(missionListNodeOptionData.selectedMission != mission))\n\t\t\t\t{\n\t\t\t\t\tguid = missionListNodeOptionData.resultingNode;\n\t\t\t\t\tflag = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!flag)\n\t\t\t{\n\t\t\t\tguid = missionListSpeechNodeData.defaultResultingNode;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (abstractSpeechNodeData is ConversationData.MissionPreviewSpeechNodeData && this is NPCSimpleMissionProvider && num2 == 0 && missionProvider != null && missionProvider.TryGetMission(missionId, out var mission2) && player.Server_CanAcceptMission(missionProvider, mission2))\n\t\t{\n\t\t\tTryAssignMissionToPlayer(mission2, player);\n\t\t}\n\t\tresponseNode = abstractSpeechNodeData.responses[num2];\n\t\tif (responseNode != null)\n\t\t{\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnNpcConversationRespond\", this, player, conversationFor, responseNode) != null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (responseNode.conditions.Length != 0)\n\t\t\t{\n\t\t\t\tUpdateFlags();\n\t\t\t}\n\t\t\tbool num3 = responseNode.PassesConditions(player, this);\n\t\t\tif (num3)\n\t\t\t{\n\t\t\t\tstring actionString = responseNode.GetActionString();\n\t\t\t\tif (!string.IsNullOrEmpty(actionString))\n\t\t\t\t{\n\t\t\t\t\tOnConversationAction(player, actionString);\n\t\t\t\t}\n\t\t\t}\n\t\t\tguid = (num3 ? responseNode.resultingSpeechNode : responseNode.GetFailedSpeechNode(player, this));\n\t\t}\n\t}\n\tconversationFor.GetFirstSpeechNodeFrom(player, this, guid, out var nodeIndex);\n\tif (nodeIndex == -1)\n\t{\n\t\tForceEndConversation(player);\n\t\treturn;\n\t}\n\tForceSpeechNode(player, conversationFor, nodeIndex);\n\tOxide.Core.Interface.CallHook(\"OnNpcConversationResponded\", this, player, conversationFor, responseNode);\n}\n",
      "ParametersText": "NPCTalking nPCTalking, BasePlayer local0, ConversationData local5, ConversationData.ResponseNode local17",
      "TargetName": "NPCTalking",
      "MethodName": "Server_ResponsePressed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1853740711,
      "Name": "OnNpcConversationEnded",
      "FullName": "OnNpcConversationEnded",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCTalking",
          "typeName": "NPCTalking",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an npc conversation ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Server_OnConversationEnded(BasePlayer player)\n{\n\tOxide.Core.Interface.CallHook(\"OnNpcConversationEnded\", this, player);\n\tif (conversingPlayers.Contains(player))\n\t{\n\t\tconversingPlayers.Remove(player);\n\t}\n}\n",
      "ParametersText": "NPCTalking nPCTalking",
      "TargetName": "NPCTalking",
      "MethodName": "Server_OnConversationEnded",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3194214181,
      "Name": "OnNpcConversationStart",
      "FullName": "OnNpcConversationStart",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "nPCTalking",
          "typeName": "NPCTalking",
          "optional": false
        },
        {
          "name": "ply",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "ConversationData",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an npc conversation starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\npublic void Server_BeginTalking(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tServer_BeginTalking(player);\n}\n",
      "ParametersText": "NPCTalking nPCTalking, BasePlayer ply, ConversationData local2",
      "TargetName": "NPCTalking",
      "MethodName": "Server_BeginTalking",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 978969450,
      "Name": "OnNpcTargetSense",
      "FullName": "OnNpcTargetSense",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "owner",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "ent",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "brainSenses",
          "typeName": "AIBrainSenses",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when npc target sense occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetKnown(BaseEntity ent, BaseEntity owner, AIBrainSenses brainSenses)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnNpcTargetSense\", owner, ent, brainSenses) != null)\n\t{\n\t\treturn;\n\t}\n\tIAISenses iAISenses = owner as IAISenses;\n\tBasePlayer basePlayer = ent as BasePlayer;\n\tif (basePlayer != null && PlayerIgnoreList.Contains(basePlayer))\n\t{\n\t\treturn;\n\t}\n\tbool flag = false;\n\tif (iAISenses != null && iAISenses.IsThreat(ent))\n\t{\n\t\tflag = true;\n\t\tif (brainSenses != null)\n\t\t{\n\t\t\tbrainSenses.LastThreatTimestamp = UnityEngine.Time.realtimeSinceStartup;\n\t\t}\n\t}\n\tfor (int i = 0; i < All.Count; i++)\n\t{\n\t\tif (All[i].Entity == ent)\n\t\t{\n\t\t\tRust.Ai.SimpleAIMemory.SeenInfo value = All[i];\n\t\t\tvalue.Position = ent.transform.position;\n\t\t\tvalue.Timestamp = UnityEngine.Mathf.Max(UnityEngine.Time.realtimeSinceStartup, value.Timestamp);\n\t\t\tAll[i] = value;\n\t\t\treturn;\n\t\t}\n\t}\n\tif (basePlayer != null)\n\t{\n\t\tif (ConVar.AI.ignoreplayers && !basePlayer.IsNpc)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tPlayers.Add(ent);\n\t}\n\tif (iAISenses != null)\n\t{\n\t\tif (iAISenses.IsTarget(ent))\n\t\t{\n\t\t\tTargets.Add(ent);\n\t\t}\n\t\tif (iAISenses.IsFriendly(ent))\n\t\t{\n\t\t\tFriendlies.Add(ent);\n\t\t}\n\t\tif (flag)\n\t\t{\n\t\t\tThreats.Add(ent);\n\t\t}\n\t}\n\tAll.Add(new Rust.Ai.SimpleAIMemory.SeenInfo\n\t{\n\t\tEntity = ent,\n\t\tPosition = ent.transform.position,\n\t\tTimestamp = UnityEngine.Time.realtimeSinceStartup\n\t});\n}\n",
      "ParametersText": "BaseEntity owner, BaseEntity ent, AIBrainSenses brainSenses",
      "TargetName": "Rust.Ai.SimpleAIMemory",
      "MethodName": "SetKnown",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3661887738,
      "Name": "OnAIBrainStateSwitch",
      "FullName": "OnAIBrainStateSwitch",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "baseAIBrain",
          "typeName": "BaseAIBrain",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BaseAIBrain",
          "optional": false
        },
        {
          "name": "newState",
          "typeName": "BaseAIBrain+BasicAIState",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when AI brain state switch occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool SwitchToState(AIState newState, int stateContainerID = -1)\n{\n\tif (!HasState(newState))\n\t{\n\t\treturn false;\n\t}\n\tbool num = SwitchToState(states[newState], stateContainerID);\n\tif (num)\n\t{\n\t\tOnStateChanged();\n\t}\n\treturn num;\n}\n",
      "ParametersText": "BaseAIBrain baseAIBrain, BaseAIBrain self1, BaseAIBrain.BasicAIState newState",
      "TargetName": "BaseAIBrain",
      "MethodName": "SwitchToState",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3422229130,
      "Name": "OnAIBrainStateSwitched",
      "FullName": "OnAIBrainStateSwitched",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "baseAIBrain",
          "typeName": "BaseAIBrain",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BaseAIBrain",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an AI brAIn state is switched."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool SwitchToState(AIState newState, int stateContainerID = -1)\n{\n\tif (!HasState(newState))\n\t{\n\t\treturn false;\n\t}\n\tbool num = SwitchToState(states[newState], stateContainerID);\n\tif (num)\n\t{\n\t\tOnStateChanged();\n\t}\n\treturn num;\n}\n",
      "ParametersText": "BaseAIBrain baseAIBrain, BaseAIBrain self1",
      "TargetName": "BaseAIBrain",
      "MethodName": "SwitchToState",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1075290686,
      "Name": "CanDeployScientists",
      "FullName": "CanDeployScientists [BradleyAPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to deploy scientists.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool CanDeployScientists(BaseEntity attacker, System.Collections.Generic.List<GameObjectRef> scientistPrefabs, System.Collections.Generic.List<UnityEngine.Vector3> spawnPositions)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanDeployScientists\", this, attacker, scientistPrefabs, spawnPositions);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tint count = scientistPrefabs.Count;\n\tif (!inDeployedState && UnityEngine.Vector3.Distance(attacker.transform.position, base.transform.position) > DeployAttackDistanceMax)\n\t{\n\t\treturn false;\n\t}\n\tspawnPositions.Clear();\n\tbool flag = false;\n\tint num = 0;\n\tint num2 = 0;\n\tint layerMask = 8454144;\n\twhile (!flag)\n\t{\n\t\tif (UnityEngine.Physics.Raycast(ScientistSpawnPoints[num2 % ScientistSpawnPoints.Count].transform.position + UnityEngine.Vector3.up * 1f, UnityEngine.Vector3.down, out var hitInfo, 2f, layerMask) && UnityEngine.AI.NavMesh.SamplePosition(hitInfo.point + UnityEngine.Vector3.up * 0.3f, out var _, 6f, walkableAreaMask))\n\t\t{\n\t\t\tspawnPositions.Add(hitInfo.point + UnityEngine.Vector3.up * 0.1f);\n\t\t\tnum2++;\n\t\t\tif (num2 >= count)\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnum++;\n\t\t\tif (num > count * 2)\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t}\n\treturn !flag;\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "CanDeployScientists",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 321045627,
      "Name": "OnScientistInitialized",
      "FullName": "OnScientistInitialized [BradleyAPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        },
        {
          "name": "scientist",
          "typeName": "ScientistNPC",
          "optional": false
        },
        {
          "name": "spawnPos",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a scientist is initialized."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void InitScientist(ScientistNPC scientist, UnityEngine.Vector3 spawnPos, BasePlayer triggerPlayer, bool roadSpawned, bool startChasing)\n{\n\tif (scientist == null)\n\t{\n\t\treturn;\n\t}\n\tscientist.transform.position = spawnPos;\n\tif (!scientist.Brain.Navigator.PlaceOnNavMesh(0.2f))\n\t{\n\t\tactiveScientists.Remove(scientist);\n\t\tscientist.Kill();\n\t\treturn;\n\t}\n\tif (triggerPlayer != null)\n\t{\n\t\tscientist.Brain.Events.Memory.Entity.Set(triggerPlayer, 0);\n\t\tscientist.Brain.Senses.Memory.SetKnown(triggerPlayer, scientist, null);\n\t\tscientist.Brain.Events.Memory.Position.Set(scientist.Brain.Navigator.transform.position, 7);\n\t\tscientist.Brain.Events.Memory.Position.Set(scientist.Brain.Navigator.transform.position, 4);\n\t\tscientist.Brain.Events.Memory.Entity.Set(this, 7);\n\t\tAttackEntity attackEntity = scientist.GetAttackEntity();\n\t\tif (SetScientistChaseBasedOnWeapon && attackEntity != null && !attackEntity.CanUseAtLongRange)\n\t\t{\n\t\t\tstartChasing = true;\n\t\t}\n\t\tscientist.Brain.Navigator.CanPathFindToChaseTargetIfNoMovePoint = startChasing;\n\t\tscientist.Brain.Navigator.CanUseRandomMovePointIfNonFound = !startChasing;\n\t\tif (startChasing)\n\t\t{\n\t\t\tscientist.Brain.SwitchToState(AIState.Chase, 6);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tscientist.Brain.SwitchToState(AIState.TakeCover, 4);\n\t\t}\n\t\tscientist.Brain.Think(0f);\n\t}\n\tOxide.Core.Interface.CallHook(\"OnScientistInitialized\", this, scientist, spawnPos);\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC, ScientistNPC scientist, UnityEngine.Vector3 spawnPos",
      "TargetName": "BradleyAPC",
      "MethodName": "InitScientist",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3620384264,
      "Name": "OnScientistRecalled",
      "FullName": "OnScientistRecalled [BradleyAPC]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a scientist is recalled."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnScientistMounted(ScientistNPC scientist)\n{\n\tif (!(scientist == null))\n\t{\n\t\tif (scientistPrefabLookUp.TryGetValue(scientist.prefabID, out var value))\n\t\t{\n\t\t\tmountedScientistPrefabs.Add(value);\n\t\t}\n\t\tactiveScientists.Remove(scientist);\n\t\tnumberOfScientistsToSpawn++;\n\t\tOxide.Core.Interface.CallHook(\"OnScientistRecalled\", this, scientist);\n\t}\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "OnScientistMounted",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 338615359,
      "Name": "OnCorpsePopulate",
      "FullName": "OnCorpsePopulate [Rust.Ai.Gen2.State_Dead]",
      "Category": "NPC",
      "Parameters": [
        {
          "name": "rust.Ai.Gen2.State_Dead",
          "typeName": "Rust.Ai.Gen2.State_Dead",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "LootableCorpse",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when corpse populate occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void StartRagdoll()\n{\n\tBaseCorpse baseCorpse = Owner.DropCorpse(CorpsePrefab.resourcePath);\n\tif (BaseNetworkableEx.Is<LootableCorpse>(baseCorpse, out var castedUnityObject))\n\t{\n\t\tcastedUnityObject.TakeFrom(Owner, CreateInventory());\n\t\tPrefabInformation prefabInformation = PrefabAttribute.server.Find<PrefabInformation>(Owner.prefabID);\n\t\tif (prefabInformation != null && prefabInformation.title.IsValid())\n\t\t{\n\t\t\tcastedUnityObject.playerName = prefabInformation.title.translated;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcastedUnityObject.playerName = Owner.GetType().Name;\n\t\t}\n\t\tcastedUnityObject.Spawn();\n\t\tbaseCorpse.TakeChildren(Owner);\n\t\tif (Oxide.Core.Interface.CallHook(\"OnCorpsePopulate\", Owner, castedUnityObject) == null && LootSpawnSlots.Length != 0)\n\t\t{\n\t\t\tLootContainer.LootSpawnSlot[] lootSpawnSlots = LootSpawnSlots;\n\t\t\tfor (int i = 0; i < lootSpawnSlots.Length; i++)\n\t\t\t{\n\t\t\t\tLootContainer.LootSpawnSlot lootSpawnSlot = lootSpawnSlots[i];\n\t\t\t\tfor (int j = 0; j < lootSpawnSlot.numberToSpawn; j++)\n\t\t\t\t{\n\t\t\t\t\tif (UnityEngine.Random.Range(0f, 1f) <= lootSpawnSlot.probability)\n\t\t\t\t\t{\n\t\t\t\t\t\tlootSpawnSlot.definition.SpawnIntoContainer(castedUnityObject.containers[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (baseCorpse != null)\n\t{\n\t\tbaseCorpse.Spawn();\n\t\tbaseCorpse.TakeChildren(Owner);\n\t}\n\tOwner.Invoke(Owner.KillMessage, 0.5f);\n}\n",
      "ParametersText": "Rust.Ai.Gen2.State_Dead rust.Ai.Gen2.State_Dead, LootableCorpse local1",
      "TargetName": "Rust.Ai.Gen2.State_Dead",
      "MethodName": "StartRagdoll",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 338615359,
      "Name": "OnCorpsePopulate",
      "FullName": "OnCorpsePopulate [Rust.Ai.Gen2.State_Dead] [Patch]",
      "Category": "NPC",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when corpse populate occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void StartRagdoll()\n{\n\tBaseCorpse baseCorpse = Owner.DropCorpse(CorpsePrefab.resourcePath);\n\tif (BaseNetworkableEx.Is<LootableCorpse>(baseCorpse, out var castedUnityObject))\n\t{\n\t\tcastedUnityObject.TakeFrom(Owner, CreateInventory());\n\t\tPrefabInformation prefabInformation = PrefabAttribute.server.Find<PrefabInformation>(Owner.prefabID);\n\t\tif (prefabInformation != null && prefabInformation.title.IsValid())\n\t\t{\n\t\t\tcastedUnityObject.playerName = prefabInformation.title.translated;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tcastedUnityObject.playerName = Owner.GetType().Name;\n\t\t}\n\t\tcastedUnityObject.Spawn();\n\t\tbaseCorpse.TakeChildren(Owner);\n\t\tif (Oxide.Core.Interface.CallHook(\"OnCorpsePopulate\", Owner, castedUnityObject) == null && LootSpawnSlots.Length != 0)\n\t\t{\n\t\t\tLootContainer.LootSpawnSlot[] lootSpawnSlots = LootSpawnSlots;\n\t\t\tfor (int i = 0; i < lootSpawnSlots.Length; i++)\n\t\t\t{\n\t\t\t\tLootContainer.LootSpawnSlot lootSpawnSlot = lootSpawnSlots[i];\n\t\t\t\tfor (int j = 0; j < lootSpawnSlot.numberToSpawn; j++)\n\t\t\t\t{\n\t\t\t\t\tif (UnityEngine.Random.Range(0f, 1f) <= lootSpawnSlot.probability)\n\t\t\t\t\t{\n\t\t\t\t\t\tlootSpawnSlot.definition.SpawnIntoContainer(castedUnityObject.containers[0]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (baseCorpse != null)\n\t{\n\t\tbaseCorpse.Spawn();\n\t\tbaseCorpse.TakeChildren(Owner);\n\t}\n\tOwner.Invoke(Owner.KillMessage, 0.5f);\n}\n",
      "ParametersText": "",
      "TargetName": "Rust.Ai.Gen2.State_Dead",
      "MethodName": "StartRagdoll",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1066895325,
      "Name": "OnNpcTarget",
      "FullName": "OnNpcTarget [AIBrainSenses]",
      "Category": "NPC",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when npc target occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private BaseEntity GetNearest(System.Collections.Generic.List<BaseEntity> entities, float rangeFraction)\n{\n\tif (entities == null || entities.Count == 0)\n\t{\n\t\treturn null;\n\t}\n\tfloat num = float.PositiveInfinity;\n\tBaseEntity result = null;\n\tforeach (BaseEntity entity in entities)\n\t{\n\t\tif (!(entity == null) && !(entity.Health() <= 0f) && Oxide.Core.Interface.CallHook(\"OnNpcTarget\", owner, entity) == null)\n\t\t{\n\t\t\tfloat num2 = UnityEngine.Vector3.Distance(entity.transform.position, owner.transform.position);\n\t\t\tif (num2 <= rangeFraction * maxRange && num2 < num)\n\t\t\t{\n\t\t\t\tresult = entity;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n",
      "ParametersText": "",
      "TargetName": "AIBrainSenses",
      "MethodName": "GetNearest",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Pet": [
    {
      "Id": 584448208,
      "Name": "OnFrankensteinPetWake",
      "FullName": "OnFrankensteinPetWake [FrankensteinTable]",
      "Category": "Pet",
      "Parameters": [
        {
          "name": "frankensteinTable",
          "typeName": "FrankensteinTable",
          "optional": false
        },
        {
          "name": "owner",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a frankenstein pet wakes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void WakeFrankenstein(BasePlayer owner)\n{\n\tif (!(owner == null) && CanStartCreating(owner) && Oxide.Core.Interface.CallHook(\"OnFrankensteinPetWake\", this, owner) == null)\n\t{\n\t\twaking = true;\n\t\tbase.inventory.SetLocked(isLocked: true);\n\t\tSendNetworkUpdateImmediate();\n\t\tStartCoroutine(DelayWakeFrankenstein(owner));\n\t\tClientRPC(RpcTarget.NetworkGroup(\"CL_WakeFrankenstein\"));\n\t}\n}\n",
      "ParametersText": "FrankensteinTable frankensteinTable, BasePlayer owner",
      "TargetName": "FrankensteinTable",
      "MethodName": "WakeFrankenstein",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1722860509,
      "Name": "OnFrankensteinPetSleep",
      "FullName": "OnFrankensteinPetSleep [FrankensteinTable]",
      "Category": "Pet",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "FrankensteinPet",
          "optional": false
        },
        {
          "name": "frankensteinTable",
          "typeName": "FrankensteinTable",
          "optional": false
        },
        {
          "name": "owner",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a frankenstein pet sleeps."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void SleepFrankenstein(BasePlayer owner)\n{\n\tif (IsInventoryEmpty() && !(owner == null) && !(owner.PetEntity == null))\n\t{\n\t\tFrankensteinPet frankensteinPet = owner.PetEntity as FrankensteinPet;\n\t\tif (!(frankensteinPet == null) && !(UnityEngine.Vector3.Distance(base.transform.position, frankensteinPet.transform.position) >= 5f) && Oxide.Core.Interface.CallHook(\"OnFrankensteinPetSleep\", frankensteinPet, this, owner) == null)\n\t\t{\n\t\t\tReturnFrankensteinItems(frankensteinPet);\n\t\t\tItemManager.DoRemoves();\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tfrankensteinPet.Kill();\n\t\t}\n\t}\n}\n",
      "ParametersText": "FrankensteinPet local0, FrankensteinTable frankensteinTable, BasePlayer owner",
      "TargetName": "FrankensteinTable",
      "MethodName": "SleepFrankenstein",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Phone": [
    {
      "Id": 1818430455,
      "Name": "OnPhoneAnswer",
      "FullName": "OnPhoneAnswer",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when phone answer occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AnswerPhone(BaseEntity.RPCMessage msg)\n{\n\tif (IsInvoking(TimeOutDialing))\n\t{\n\t\tCancelInvoke(TimeOutDialing);\n\t}\n\tif (!(activeCallTo == null))\n\t{\n\t\tBasePlayer player = msg.player;\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhoneAnswer\", this, activeCallTo) == null)\n\t\t{\n\t\t\tUpdateServerPlayer(player);\n\t\t\tBeginCall();\n\t\t\tactiveCallTo.BeginCall();\n\t\t\tOxide.Core.Interface.CallHook(\"OnPhoneAnswered\", this, activeCallTo);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1",
      "TargetName": "PhoneController",
      "MethodName": "AnswerPhone",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3536074469,
      "Name": "OnPhoneCallStart",
      "FullName": "OnPhoneCallStart",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self2",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone call starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void BeginCall()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPhoneCallStart\", this, activeCallTo, currentPlayer) == null)\n\t{\n\t\tif (IsMobile && activeCallTo != null && !activeCallTo.RequirePower)\n\t\t{\n\t\t\t_ = currentPlayer != null;\n\t\t}\n\t\tSetPhoneStateWithPlayer(Telephone.CallState.InProcess);\n\t\tInvoke(TimeOutCall, TelephoneManager.MaxCallLength);\n\t\tOxide.Core.Interface.CallHook(\"OnPhoneCallStarted\", this, activeCallTo, currentPlayer);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1, PhoneController self2",
      "TargetName": "PhoneController",
      "MethodName": "BeginCall",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2840999274,
      "Name": "OnPhoneCallStarted",
      "FullName": "OnPhoneCallStarted",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self2",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone call starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void BeginCall()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPhoneCallStart\", this, activeCallTo, currentPlayer) == null)\n\t{\n\t\tif (IsMobile && activeCallTo != null && !activeCallTo.RequirePower)\n\t\t{\n\t\t\t_ = currentPlayer != null;\n\t\t}\n\t\tSetPhoneStateWithPlayer(Telephone.CallState.InProcess);\n\t\tInvoke(TimeOutCall, TelephoneManager.MaxCallLength);\n\t\tOxide.Core.Interface.CallHook(\"OnPhoneCallStarted\", this, activeCallTo, currentPlayer);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1, PhoneController self2",
      "TargetName": "PhoneController",
      "MethodName": "BeginCall",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1680123496,
      "Name": "CanReceiveCall",
      "FullName": "CanReceiveCall",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to receive call.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool CanReceiveCall()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanReceiveCall\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (RequirePower && !IsPowered())\n\t{\n\t\treturn false;\n\t}\n\tif (RequireParent && !base.baseEntity.HasParent())\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "PhoneController phoneController",
      "TargetName": "PhoneController",
      "MethodName": "CanReceiveCall",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1241230080,
      "Name": "OnPhoneDial",
      "FullName": "OnPhoneDial",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when phone dial occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void CallPhone(int number)\n{\n\tif (number == PhoneNumber)\n\t{\n\t\tOnDialFailed(Telephone.DialFailReason.CallSelf);\n\t\treturn;\n\t}\n\tif (TelephoneManager.GetCurrentActiveCalls() + 1 > TelephoneManager.MaxConcurrentCalls)\n\t{\n\t\tOnDialFailed(Telephone.DialFailReason.NetworkBusy);\n\t\treturn;\n\t}\n\tPhoneController telephone = TelephoneManager.GetTelephone(number);\n\tif (telephone != null)\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhoneDial\", this, telephone, currentPlayer) == null)\n\t\t{\n\t\t\tif (telephone.serverState == Telephone.CallState.Idle && telephone.CanReceiveCall())\n\t\t\t{\n\t\t\t\tSetPhoneState(Telephone.CallState.Dialing);\n\t\t\t\tlastDialedNumber = number;\n\t\t\t\tactiveCallTo = telephone;\n\t\t\t\tactiveCallTo.ReceiveCallFrom(this);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tOnDialFailed(Telephone.DialFailReason.Engaged);\n\t\t\t\ttelephone.OnIncomingCallWhileBusy();\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tOnDialFailed(Telephone.DialFailReason.WrongNumber);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController local0, PhoneController self1",
      "TargetName": "PhoneController",
      "MethodName": "CallPhone",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2555568850,
      "Name": "OnPhoneDialFail",
      "FullName": "OnPhoneDialFail",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "Telephone+DialFailReason",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone dial fails."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnDialFailed(Telephone.DialFailReason reason)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPhoneDialFail\", this, reason, currentPlayer) == null)\n\t{\n\t\tSetPhoneState(Telephone.CallState.Idle);\n\t\tbase.baseEntity.ClientRPC(RpcTarget.NetworkGroup(\"ClientOnDialFailed\"), (int)reason);\n\t\tactiveCallTo = null;\n\t\tif (IsInvoking(TimeOutCall))\n\t\t{\n\t\t\tCancelInvoke(TimeOutCall);\n\t\t}\n\t\tif (IsInvoking(TriggerTimeOut))\n\t\t{\n\t\t\tCancelInvoke(TriggerTimeOut);\n\t\t}\n\t\tif (IsInvoking(TimeOutDialing))\n\t\t{\n\t\t\tCancelInvoke(TimeOutDialing);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnPhoneDialFailed\", this, reason, currentPlayer);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, Telephone.DialFailReason reason, PhoneController self1",
      "TargetName": "PhoneController",
      "MethodName": "OnDialFailed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 772238272,
      "Name": "OnPhoneDialTimeout",
      "FullName": "OnPhoneDialTimeout",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self2",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when phone dial timeout occurs.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void TimeOutDialing()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPhoneDialTimeout\", activeCallTo, this, activeCallTo.currentPlayer) == null)\n\t{\n\t\tif (activeCallTo != null)\n\t\t{\n\t\t\tactiveCallTo.ServerPlayAnsweringMessage(this);\n\t\t}\n\t\tSetPhoneState(Telephone.CallState.Idle);\n\t\tOxide.Core.Interface.CallHook(\"OnPhoneDialTimedOut\", activeCallTo, this, activeCallTo.currentPlayer);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1, PhoneController self2",
      "TargetName": "PhoneController",
      "MethodName": "TimeOutDialing",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2908630240,
      "Name": "OnPhoneDialFailed",
      "FullName": "OnPhoneDialFailed",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "reason",
          "typeName": "Telephone+DialFailReason",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone dial fails."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void OnDialFailed(Telephone.DialFailReason reason)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPhoneDialFail\", this, reason, currentPlayer) == null)\n\t{\n\t\tSetPhoneState(Telephone.CallState.Idle);\n\t\tbase.baseEntity.ClientRPC(RpcTarget.NetworkGroup(\"ClientOnDialFailed\"), (int)reason);\n\t\tactiveCallTo = null;\n\t\tif (IsInvoking(TimeOutCall))\n\t\t{\n\t\t\tCancelInvoke(TimeOutCall);\n\t\t}\n\t\tif (IsInvoking(TriggerTimeOut))\n\t\t{\n\t\t\tCancelInvoke(TriggerTimeOut);\n\t\t}\n\t\tif (IsInvoking(TimeOutDialing))\n\t\t{\n\t\t\tCancelInvoke(TimeOutDialing);\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnPhoneDialFailed\", this, reason, currentPlayer);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, Telephone.DialFailReason reason, PhoneController self1",
      "TargetName": "PhoneController",
      "MethodName": "OnDialFailed",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 31481961,
      "Name": "OnPhoneDialTimedOut",
      "FullName": "OnPhoneDialTimedOut",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self2",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when phone dial timed out occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void TimeOutDialing()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnPhoneDialTimeout\", activeCallTo, this, activeCallTo.currentPlayer) == null)\n\t{\n\t\tif (activeCallTo != null)\n\t\t{\n\t\t\tactiveCallTo.ServerPlayAnsweringMessage(this);\n\t\t}\n\t\tSetPhoneState(Telephone.CallState.Idle);\n\t\tOxide.Core.Interface.CallHook(\"OnPhoneDialTimedOut\", activeCallTo, this, activeCallTo.currentPlayer);\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1, PhoneController self2",
      "TargetName": "PhoneController",
      "MethodName": "TimeOutDialing",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 459265237,
      "Name": "OnPhoneAnswered",
      "FullName": "OnPhoneAnswered",
      "Category": "Phone",
      "Parameters": [
        {
          "name": "phoneController",
          "typeName": "PhoneController",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "PhoneController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a phone is answered."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AnswerPhone(BaseEntity.RPCMessage msg)\n{\n\tif (IsInvoking(TimeOutDialing))\n\t{\n\t\tCancelInvoke(TimeOutDialing);\n\t}\n\tif (!(activeCallTo == null))\n\t{\n\t\tBasePlayer player = msg.player;\n\t\tif (Oxide.Core.Interface.CallHook(\"OnPhoneAnswer\", this, activeCallTo) == null)\n\t\t{\n\t\t\tUpdateServerPlayer(player);\n\t\t\tBeginCall();\n\t\t\tactiveCallTo.BeginCall();\n\t\t\tOxide.Core.Interface.CallHook(\"OnPhoneAnswered\", this, activeCallTo);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PhoneController phoneController, PhoneController self1",
      "TargetName": "PhoneController",
      "MethodName": "AnswerPhone",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Primitive": [
    {
      "Id": 2994302818,
      "Name": "OnBallistaGunReload",
      "FullName": "OnBallistaGunReload",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "ballistaGun",
          "typeName": "BallistaGun",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\n[BaseEntity.RPC_Server.FromMounted]\n[BaseEntity.RPC_Server]\nprivate void SERVER_ReloadStart(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tBasePlayer mounted = GetMounted();\n\tif (!(mounted == null) && !(player == null) && !(player != mounted) && !UnableToStartReloadServer(player) && Oxide.Core.Interface.CallHook(\"OnBallistaGunReload\", this, player) == null)\n\t{\n\t\treloadingPlayer = player;\n\t\tSetFlag(BaseEntity.Flags.Reserved4, b: true);\n\t\tClientRPC(RpcTarget.NetworkGroup(\"CLIENT_StartReloading\"), reloadingPlayer.net.ID);\n\t\tInvokeRepeating(ReloadProgress, 0f, progressTickRate);\n\t\tif (HasOwner())\n\t\t{\n\t\t\tballistaOwner.RefreshLastUseTime();\n\t\t}\n\t\tServer_OnReloadStarted();\n\t}\n}\n",
      "ParametersText": "BallistaGun ballistaGun, BasePlayer local0",
      "TargetName": "BallistaGun",
      "MethodName": "SERVER_ReloadStart",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2897059420,
      "Name": "OnCatapultFireForce",
      "FullName": "OnCatapultFireForce",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "catapult",
          "typeName": "Catapult",
          "optional": false
        },
        {
          "name": "shooter",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when catapult fire force occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool Fire(BasePlayer shooter, float force)\n{\n\tFireRecoil();\n\tfloat num = UnityEngine.Mathf.Lerp(2f, 1f, UnityEngine.Mathf.Clamp01(force));\n\tfloat num2 = UnityEngine.Mathf.Lerp(0.5f, 1f, UnityEngine.Mathf.Clamp01(force));\n\tbool flag = true;\n\tUnityEngine.Vector3 firingPos = muzzle.position;\n\tBasePlayer passenger = GetPassenger();\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnCatapultFireForce\", this, shooter, num2);\n\tif (obj is float)\n\t{\n\t\tnum2 = (float)obj;\n\t}\n\tif (passenger != null)\n\t{\n\t\tpassenger.ServerPosition = muzzle.transform.position;\n\t\tpassenger.Ragdoll(muzzle.transform.forward * (20f * num2) + UnityEngine.Vector3.up * (2.5f * num), matchPlayerGravity: false, flailInAir: true, dieOnImpact: true, this);\n\t\treturn true;\n\t}\n\tif (GamePhysics.CheckSphere(muzzle.position, 1f, 1236994833, UnityEngine.QueryTriggerInteraction.Ignore))\n\t{\n\t\tUnityEngine.Vector3 vector = base.transform.position + UnityEngine.Vector3.up * 2f;\n\t\tif (GamePhysics.Trace(new UnityEngine.Ray(vector, muzzle.position - vector), 0f, out var hitInfo, 10f, 1236994833, UnityEngine.QueryTriggerInteraction.Ignore))\n\t\t{\n\t\t\tflag = false;\n\t\t\tfiringPos = hitInfo.point - UnityEngine.Vector3.up;\n\t\t}\n\t}\n\tServerProjectile projectile2;\n\tif (loadedAmmoDef == BoulderItemDef)\n\t{\n\t\tItemModCatapultBoulder component = loadedAmmoDef.GetComponent<ItemModCatapultBoulder>();\n\t\tif (component == null)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tforeach (ItemModCatapultBoulder.ProjectileSettings projectileSetting in component.projectileSettings)\n\t\t{\n\t\t\tfor (int i = 0; i < projectileSetting.count; i++)\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 forward = muzzle.forward;\n\t\t\t\tforward = UnityEngine.Quaternion.Euler(UnityEngine.Random.Range(0f - component.spreadAngle, component.spreadAngle), UnityEngine.Random.Range(0f - component.spreadAngle, component.spreadAngle), 0f) * forward;\n\t\t\t\tif (FireProjectile(projectileSetting.prefab, firingPos, forward, shooter, 0.25f, 30f * num2, out var projectile))\n\t\t\t\t{\n\t\t\t\t\tif (!flag)\n\t\t\t\t\t{\n\t\t\t\t\t\tprojectile.GetComponent<TimedExplosive>()?.ForceExplode();\n\t\t\t\t\t}\n\t\t\t\t\tprojectile.ignoreEntity = this;\n\t\t\t\t\tprojectile.gravityModifier *= num * UnityEngine.Random.Range(1f - projectileSetting.gravityModifier, 1f + projectileSetting.gravityModifier);\n\t\t\t\t\tshooter.MarkHostileFor();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tloadedAmmoItem.UseItem();\n\t}\n\telse if (TryFireProjectile(ammoStorageRef.Get(base.isServer), Rust.AmmoTypes.CATAPULT_BOULDER, firingPos, muzzle.forward, shooter, 0.25f, 30f * num2, out projectile2))\n\t{\n\t\tprojectile2.ignoreEntity = this;\n\t\tif (!flag)\n\t\t{\n\t\t\tprojectile2.GetComponent<TimedExplosive>()?.ForceExplode();\n\t\t}\n\t\tprojectile2.gravityModifier *= num;\n\t\tshooter.MarkHostileFor();\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "Catapult catapult, BasePlayer shooter, float local1",
      "TargetName": "Catapult",
      "MethodName": "Fire",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3849505322,
      "Name": "OnSiegeWeaponFire",
      "FullName": "OnSiegeWeaponFire [Catapult]",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "catapult",
          "typeName": "Catapult",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a siege weapon fires."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void SERVER_WantsFire(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (CanFire() && Oxide.Core.Interface.CallHook(\"OnSiegeWeaponFire\", this, player) == null)\n\t{\n\t\tfloat force = reloadProgress;\n\t\tFire(player, force);\n\t\treloadProgress = 0f;\n\t\ttimeSinceLastFire = 0f;\n\t\tFireAnimation();\n\t\tGameObjectRef loadedAmmoFiringEffect = GetLoadedAmmoFiringEffect();\n\t\tif (loadedAmmoFiringEffect != null && loadedAmmoFiringEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(loadedAmmoFiringEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.up, null, broadcast: true);\n\t\t}\n\t\tRefreshLastUseTime();\n\t\tClientRPC(RpcTarget.NetworkGroup(\"CLIENT_Fire\"));\n\t}\n}\n",
      "ParametersText": "Catapult catapult, BasePlayer local0",
      "TargetName": "Catapult",
      "MethodName": "SERVER_WantsFire",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3849505322,
      "Name": "OnSiegeWeaponFire",
      "FullName": "OnSiegeWeaponFire [BatteringRam]",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "batteringRam",
          "typeName": "BatteringRam",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a siege weapon fires."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void SERVER_WantsAttack(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tBasePlayer driver = GetDriver();\n\tif (!(driver == null) && !(player == null) && !(driver != player) && CanAttack() && !driver.InSafeZone() && Oxide.Core.Interface.CallHook(\"OnSiegeWeaponFire\", this, player) == null)\n\t{\n\t\tClientRPC(RpcTarget.NetworkGroup(\"CLIENT_Attack\"));\n\t\tInvoke(delegate\n\t\t{\n\t\t\tScanEntities(driver);\n\t\t}, 2f);\n\t\tSetFlag(BaseEntity.Flags.Busy, b: true);\n\t\tInvoke(delegate\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Busy, b: false);\n\t\t}, timeBetweenFire);\n\t}\n}\n",
      "ParametersText": "BatteringRam batteringRam, BasePlayer local1",
      "TargetName": "BatteringRam",
      "MethodName": "SERVER_WantsAttack",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1497098116,
      "Name": "OnSiegeWeaponDoorOpen",
      "FullName": "OnSiegeWeaponDoorOpen [BatteringRam]",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "batteringRam",
          "typeName": "BatteringRam",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a siege weapon door is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprotected void RPC_OpenDoor(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract(usableWhileCrawling: true) && CanOpenDoor() && Oxide.Core.Interface.CallHook(\"OnSiegeWeaponDoorOpen\", this, rpc.player) == null)\n\t{\n\t\tOpenDoor();\n\t}\n}\n",
      "ParametersText": "BatteringRam batteringRam, BasePlayer player",
      "TargetName": "BatteringRam",
      "MethodName": "RPC_OpenDoor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2664272771,
      "Name": "OnSiegeWeaponDoorClose",
      "FullName": "OnSiegeWeaponDoorClose [BatteringRam]",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "batteringRam",
          "typeName": "BatteringRam",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a siege weapon door is closed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(2uL)]\nprotected void RPC_CloseDoor(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract(usableWhileCrawling: true) && CanCloseDoor() && Oxide.Core.Interface.CallHook(\"OnSiegeWeaponDoorClose\", this, rpc.player) == null)\n\t{\n\t\tCloseDoor();\n\t}\n}\n",
      "ParametersText": "BatteringRam batteringRam, BasePlayer player",
      "TargetName": "BatteringRam",
      "MethodName": "RPC_CloseDoor",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2446236079,
      "Name": "OnSiegeWeaponPull",
      "FullName": "OnSiegeWeaponPull",
      "Category": "Primitive",
      "Parameters": [
        {
          "name": "baseSiegeWeapon",
          "typeName": "BaseSiegeWeapon",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when siege weapon pull occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void SERVER_StartPulling(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (CanPullNow(player) && !(rigidBody == null) && Oxide.Core.Interface.CallHook(\"OnSiegeWeaponPull\", this, msg.player) == null && (!OnlyOwnerAccessible() || !(player != creatorEntity)))\n\t{\n\t\tplayer.metabolism.calories.Subtract(3f);\n\t\tplayer.metabolism.SendChanges();\n\t\tif (rigidBody.IsSleeping())\n\t\t{\n\t\t\trigidBody.WakeUp();\n\t\t}\n\t\tStartPulling(player);\n\t}\n}\n",
      "ParametersText": "BaseSiegeWeapon baseSiegeWeapon, BasePlayer player",
      "TargetName": "BaseSiegeWeapon",
      "MethodName": "SERVER_StartPulling",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Queue": [
    {
      "Id": 1069686209,
      "Name": "OnConnectionDequeue",
      "FullName": "OnConnectionDequeue",
      "Category": "Queue",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when connection dequeue occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RemoveConnection(Network.Connection connection)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnConnectionDequeue\", connection) == null)\n\t{\n\t\tif (queue.Remove(connection))\n\t\t{\n\t\t\tnextMessageTime = 0f;\n\t\t}\n\t\tjoining.Remove(connection);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ConnectionQueue",
      "MethodName": "RemoveConnection",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 174112689,
      "Name": "OnConnectionQueue",
      "FullName": "OnConnectionQueue",
      "Category": "Queue",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when connection queue occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal void Join(Network.Connection connection)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnConnectionQueue\", connection) == null)\n\t{\n\t\tnextMessageTime = 0f;\n\t\tif ((Queued == 0 && !IsServerFull) || CanJumpQueue(connection))\n\t\t{\n\t\t\tJoinGame(connection);\n\t\t\treturn;\n\t\t}\n\t\tconnection.state = Network.Connection.State.InQueue;\n\t\tqueue.Add(connection);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ConnectionQueue",
      "MethodName": "Join",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3676126507,
      "Name": "OnQueueUpdate",
      "FullName": "OnQueueUpdate",
      "Category": "Queue",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a queue is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SendQueueUpdate(Network.Connection c, int position)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnQueueUpdate\", c, position) == null)\n\t{\n\t\tNetwork.NetWrite netWrite = Network.Net.sv.StartWrite();\n\t\tnetWrite.PacketID(Network.Message.Type.QueueUpdate);\n\t\tnetWrite.UInt16((ushort)Queued);\n\t\tnetWrite.UInt16((ushort)position);\n\t\tif (Network.PacketProfiler.shouldCaptureDetailedProfiling)\n\t\t{\n\t\t\tNetwork.PacketProfiler.LogDetailedOutbound(Network.Message.Type.QueueUpdate, NetworkableId.EmptyId, null, (int)netWrite.Length, null, Facepunch.Math.Epoch.Current, server: true);\n\t\t}\n\t\tnetWrite.Send(new Network.SendInfo(c));\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ConnectionQueue",
      "MethodName": "SendQueueUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1924976614,
      "Name": "OnQueueCycle",
      "FullName": "OnQueueCycle",
      "Category": "Queue",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when queue cycle occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Cycle(int availableSlots)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnQueueCycle\", availableSlots) != null)\n\t{\n\t\treturn;\n\t}\n\tif (UnityEngine.Time.realtimeSinceStartup > nextCleanupReservedSlots)\n\t{\n\t\tnextCleanupReservedSlots = UnityEngine.Time.realtimeSinceStartup + 1f;\n\t\tCleanupExpiredReservedSlots();\n\t}\n\tif (queue.Count != 0)\n\t{\n\t\tSendQueueUpdates();\n\t\tif (!IsServerFull)\n\t\t{\n\t\t\tJoinGame(queue[0]);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "ConnectionQueue",
      "MethodName": "Cycle",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Radio": [
    {
      "Id": 1710662532,
      "Name": "OnRfListenerAdd",
      "FullName": "OnRfListenerAdd",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF listener is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void AddListener(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfListenerAdd\", obj, frequency) == null && GetListenerSet(frequency).Add(obj))\n\t{\n\t\tbool value;\n\t\tbool on = _isFrequencyBroadcasting.TryGetValue(frequency, out value) && value;\n\t\tobj.RFSignalUpdate(on);\n\t\tOxide.Core.Interface.CallHook(\"OnRfListenerAdded\", obj, frequency);\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "AddListener",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1199277452,
      "Name": "OnRfListenerRemove",
      "FullName": "OnRfListenerRemove",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF listener is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RemoveListener(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfListenerRemove\", obj, frequency) == null && GetListenerSet(frequency).Remove(obj))\n\t{\n\t\tobj.RFSignalUpdate(on: false);\n\t\tOxide.Core.Interface.CallHook(\"OnRfListenerRemoved\", obj, frequency);\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "RemoveListener",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2557548599,
      "Name": "OnRfBroadcasterAdd",
      "FullName": "OnRfBroadcasterAdd",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF broadcaster is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void AddBroadcaster(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfBroadcasterAdd\", obj, frequency) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.HashSet<IRFObject> broadcasterSet = GetBroadcasterSet(frequency);\n\tif (broadcasterSet.RemoveWhere((IRFObject b) => b == null || !BaseEntityEx.IsValidEntityReference(b)) > 0)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"Found null entries in the RF broadcaster set for frequency {frequency}... cleaning up.\");\n\t}\n\tif (broadcasterSet.Add(obj))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnRfBroadcasterAdded\", obj, frequency);\n\t\tif (!_isFrequencyBroadcasting.TryGetValue(frequency, out var value) || !value)\n\t\t{\n\t\t\t_isFrequencyBroadcasting[frequency] = true;\n\t\t\tUpdateListenersForFrequency(frequency, isBroadcasting: true);\n\t\t}\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "AddBroadcaster",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3334440095,
      "Name": "OnRfBroadcasterRemove",
      "FullName": "OnRfBroadcasterRemove",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF broadcaster is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RemoveBroadcaster(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfBroadcasterRemove\", obj, frequency) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.HashSet<IRFObject> broadcasterSet = GetBroadcasterSet(frequency);\n\tif (broadcasterSet.RemoveWhere((IRFObject b) => b == null || !BaseEntityEx.IsValidEntityReference(b)) > 0)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"Found null entries in the RF broadcaster set for frequency {frequency}... cleaning up.\");\n\t}\n\tif (broadcasterSet.Remove(obj))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnRfBroadcasterRemoved\", obj, frequency);\n\t\tif (broadcasterSet.Count == 0)\n\t\t{\n\t\t\t_isFrequencyBroadcasting[frequency] = false;\n\t\t\tUpdateListenersForFrequency(frequency, isBroadcasting: false);\n\t\t}\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "RemoveBroadcaster",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 153067018,
      "Name": "OnRfBroadcasterAdded",
      "FullName": "OnRfBroadcasterAdded",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF broadcaster is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void AddBroadcaster(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfBroadcasterAdd\", obj, frequency) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.HashSet<IRFObject> broadcasterSet = GetBroadcasterSet(frequency);\n\tif (broadcasterSet.RemoveWhere((IRFObject b) => b == null || !BaseEntityEx.IsValidEntityReference(b)) > 0)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"Found null entries in the RF broadcaster set for frequency {frequency}... cleaning up.\");\n\t}\n\tif (broadcasterSet.Add(obj))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnRfBroadcasterAdded\", obj, frequency);\n\t\tif (!_isFrequencyBroadcasting.TryGetValue(frequency, out var value) || !value)\n\t\t{\n\t\t\t_isFrequencyBroadcasting[frequency] = true;\n\t\t\tUpdateListenersForFrequency(frequency, isBroadcasting: true);\n\t\t}\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "AddBroadcaster",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3106205481,
      "Name": "OnRfListenerRemoved",
      "FullName": "OnRfListenerRemoved",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF listener is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RemoveListener(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfListenerRemove\", obj, frequency) == null && GetListenerSet(frequency).Remove(obj))\n\t{\n\t\tobj.RFSignalUpdate(on: false);\n\t\tOxide.Core.Interface.CallHook(\"OnRfListenerRemoved\", obj, frequency);\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "RemoveListener",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1595251141,
      "Name": "OnRfListenerAdded",
      "FullName": "OnRfListenerAdded",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF listener is added."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void AddListener(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfListenerAdd\", obj, frequency) == null && GetListenerSet(frequency).Add(obj))\n\t{\n\t\tbool value;\n\t\tbool on = _isFrequencyBroadcasting.TryGetValue(frequency, out value) && value;\n\t\tobj.RFSignalUpdate(on);\n\t\tOxide.Core.Interface.CallHook(\"OnRfListenerAdded\", obj, frequency);\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "AddListener",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3284690232,
      "Name": "OnRfBroadcasterRemoved",
      "FullName": "OnRfBroadcasterRemoved",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "obj",
          "typeName": "IRFObject",
          "optional": false
        },
        {
          "name": "frequency",
          "typeName": "System.Int32",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF broadcaster is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RemoveBroadcaster(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfBroadcasterRemove\", obj, frequency) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.Collections.Generic.HashSet<IRFObject> broadcasterSet = GetBroadcasterSet(frequency);\n\tif (broadcasterSet.RemoveWhere((IRFObject b) => b == null || !BaseEntityEx.IsValidEntityReference(b)) > 0)\n\t{\n\t\tUnityEngine.Debug.LogWarning($\"Found null entries in the RF broadcaster set for frequency {frequency}... cleaning up.\");\n\t}\n\tif (broadcasterSet.Remove(obj))\n\t{\n\t\tOxide.Core.Interface.CallHook(\"OnRfBroadcasterRemoved\", obj, frequency);\n\t\tif (broadcasterSet.Count == 0)\n\t\t{\n\t\t\t_isFrequencyBroadcasting[frequency] = false;\n\t\t\tUpdateListenersForFrequency(frequency, isBroadcasting: false);\n\t\t}\n\t}\n}\n",
      "ParametersText": "IRFObject obj, int frequency",
      "TargetName": "RFManager",
      "MethodName": "RemoveBroadcaster",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4252766360,
      "Name": "OnRfListenerRemoved [patch]",
      "FullName": "OnRfListenerRemoved [patch]",
      "Category": "Radio",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static void RemoveListener(int frequency, IRFObject obj)\n{\n\tfrequency = ClampFrequency(frequency);\n\tif (Oxide.Core.Interface.CallHook(\"OnRfListenerRemove\", obj, frequency) == null && GetListenerSet(frequency).Remove(obj))\n\t{\n\t\tobj.RFSignalUpdate(on: false);\n\t\tOxide.Core.Interface.CallHook(\"OnRfListenerRemoved\", obj, frequency);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "RFManager",
      "MethodName": "RemoveListener",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3879911901,
      "Name": "OnRfFrequencyChange",
      "FullName": "OnRfFrequencyChange [Broadcaster]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "rFBroadcaster",
          "typeName": "RFBroadcaster",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tif (CanChangeFrequency(msg.player) && !(UnityEngine.Time.time < nextChangeTime))\n\t{\n\t\tnextChangeTime = UnityEngine.Time.time + 2f;\n\t\tint num = RFManager.ClampFrequency(msg.read.Int32());\n\t\tif (RFManager.IsReserved(num))\n\t\t{\n\t\t\tRFManager.ReserveErrorPrint(msg.player);\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnRfFrequencyChange\", this, num, msg.player) == null)\n\t\t{\n\t\t\tSetFrequency(num);\n\t\t\tHurt(MaxHealth() * 0.01f, Rust.DamageType.Decay, this);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRfFrequencyChanged\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RFBroadcaster rFBroadcaster, int local0, BasePlayer player",
      "TargetName": "RFBroadcaster",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 784684429,
      "Name": "OnRfFrequencyChanged",
      "FullName": "OnRfFrequencyChanged [Broadcaster]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "rFBroadcaster",
          "typeName": "RFBroadcaster",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tif (CanChangeFrequency(msg.player) && !(UnityEngine.Time.time < nextChangeTime))\n\t{\n\t\tnextChangeTime = UnityEngine.Time.time + 2f;\n\t\tint num = RFManager.ClampFrequency(msg.read.Int32());\n\t\tif (RFManager.IsReserved(num))\n\t\t{\n\t\t\tRFManager.ReserveErrorPrint(msg.player);\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnRfFrequencyChange\", this, num, msg.player) == null)\n\t\t{\n\t\t\tSetFrequency(num);\n\t\t\tHurt(MaxHealth() * 0.01f, Rust.DamageType.Decay, this);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRfFrequencyChanged\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RFBroadcaster rFBroadcaster, int local0, BasePlayer player",
      "TargetName": "RFBroadcaster",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3879911901,
      "Name": "OnRfFrequencyChange",
      "FullName": "OnRfFrequencyChange [Receiver]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "rFReceiver",
          "typeName": "RFReceiver",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player == null) && msg.player.CanBuild())\n\t{\n\t\tint num = RFManager.ClampFrequency(msg.read.Int32());\n\t\tif (Oxide.Core.Interface.CallHook(\"OnRfFrequencyChange\", this, num, msg.player) == null)\n\t\t{\n\t\t\tSetFrequency(num);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRfFrequencyChanged\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RFReceiver rFReceiver, int local0, BasePlayer player",
      "TargetName": "RFReceiver",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 784684429,
      "Name": "OnRfFrequencyChanged",
      "FullName": "OnRfFrequencyChanged [Receiver]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "rFReceiver",
          "typeName": "RFReceiver",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.CallsPerSecond(3uL)]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player == null) && msg.player.CanBuild())\n\t{\n\t\tint num = RFManager.ClampFrequency(msg.read.Int32());\n\t\tif (Oxide.Core.Interface.CallHook(\"OnRfFrequencyChange\", this, num, msg.player) == null)\n\t\t{\n\t\t\tSetFrequency(num);\n\t\t\tOxide.Core.Interface.CallHook(\"OnRfFrequencyChanged\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RFReceiver rFReceiver, int local0, BasePlayer player",
      "TargetName": "RFReceiver",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3879911901,
      "Name": "OnRfFrequencyChange",
      "FullName": "OnRfFrequencyChange [Detonator]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "detonator",
          "typeName": "Detonator",
          "optional": false
        },
        {
          "name": "freq",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tServerSetFrequency(msg.player, msg.read.Int32());\n}\n",
      "ParametersText": "Detonator detonator, int freq, BasePlayer player",
      "TargetName": "Detonator",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 784684429,
      "Name": "OnRfFrequencyChanged",
      "FullName": "OnRfFrequencyChanged [Detonator]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "detonator",
          "typeName": "Detonator",
          "optional": false
        },
        {
          "name": "freq",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tServerSetFrequency(msg.player, msg.read.Int32());\n}\n",
      "ParametersText": "Detonator detonator, int freq, BasePlayer player",
      "TargetName": "Detonator",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3879911901,
      "Name": "OnRfFrequencyChange",
      "FullName": "OnRfFrequencyChange [PagerEntity]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "pagerEntity",
          "typeName": "PagerEntity",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player == null) && msg.player.CanBuild() && !(UnityEngine.Time.time < nextChangeTime))\n\t{\n\t\tnextChangeTime = UnityEngine.Time.time + 2f;\n\t\tint num = msg.read.Int32();\n\t\tif (Oxide.Core.Interface.CallHook(\"OnRfFrequencyChange\", this, num, msg.player) == null)\n\t\t{\n\t\t\tRFManager.ChangeFrequency(frequency, num, this, isListener: true);\n\t\t\tfrequency = num;\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnRfFrequencyChanged\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PagerEntity pagerEntity, int local0, BasePlayer player",
      "TargetName": "PagerEntity",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 784684429,
      "Name": "OnRfFrequencyChanged",
      "FullName": "OnRfFrequencyChanged [PagerEntity]",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "pagerEntity",
          "typeName": "PagerEntity",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.Int32",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an RF frequency is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void ServerSetFrequency(BaseEntity.RPCMessage msg)\n{\n\tif (!(msg.player == null) && msg.player.CanBuild() && !(UnityEngine.Time.time < nextChangeTime))\n\t{\n\t\tnextChangeTime = UnityEngine.Time.time + 2f;\n\t\tint num = msg.read.Int32();\n\t\tif (Oxide.Core.Interface.CallHook(\"OnRfFrequencyChange\", this, num, msg.player) == null)\n\t\t{\n\t\t\tRFManager.ChangeFrequency(frequency, num, this, isListener: true);\n\t\t\tfrequency = num;\n\t\t\tSendNetworkUpdateImmediate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnRfFrequencyChanged\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "PagerEntity pagerEntity, int local0, BasePlayer player",
      "TargetName": "PagerEntity",
      "MethodName": "ServerSetFrequency",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 725502942,
      "Name": "OnBoomboxStationValidate",
      "FullName": "OnBoomboxStationValidate",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "url",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a boombox station is validated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static bool IsStationValid(string url)\n{\n\tParseServerUrlList();\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnBoomboxStationValidate\", url);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tShoutcastStreamer.CheckBuiltInRadios();\n\tif (ValidStations == null || !ValidStations.ContainsValue(url))\n\t{\n\t\tif (ServerValidStations == null || !ServerValidStations.ContainsValue(url))\n\t\t{\n\t\t\tif (ShoutcastStreamer.ParsedLocalRadioList != null)\n\t\t\t{\n\t\t\t\treturn ShoutcastStreamer.ParsedLocalRadioList.ContainsValue(url);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "string url",
      "TargetName": "BoomBox",
      "MethodName": "IsStationValid",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3026425811,
      "Name": "OnBoomboxToggle",
      "FullName": "OnBoomboxToggle",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "boomBox",
          "typeName": "BoomBox",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a boombox toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ServerTogglePlay(BaseEntity.RPCMessage msg, bool bypassPower = false)\n{\n\tif (!IsPowered() && !bypassPower)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tbool flag = msg.read.ReadByte() == 1;\n\tif (Oxide.Core.Interface.CallHook(\"OnBoomboxToggle\", this, msg.player, flag) == null)\n\t{\n\t\tif (flag && player != null && player.IsConnected && !player.IsNpc && !player.IsBot && base.baseEntity is DeployableBoomBox deployableBoomBox)\n\t\t{\n\t\t\tBaseMission.MissionEventPayload missionEventPayload = default(BaseMission.MissionEventPayload);\n\t\t\tmissionEventPayload.NetworkIdentifier = deployableBoomBox.net.ID;\n\t\t\tmissionEventPayload.WorldPosition = base.transform.position;\n\t\t\tmissionEventPayload.StringIdentifier = CurrentRadioIp;\n\t\t\tBaseMission.MissionEventPayload payload = missionEventPayload;\n\t\t\tplayer.ProcessMissionEvent(BaseMission.MissionEventType.PLAY_BOOMBOX, payload, deployableBoomBox.IsStatic ? 1f : 0f);\n\t\t}\n\t\tServerTogglePlay(flag);\n\t}\n}\n",
      "ParametersText": "BoomBox boomBox, BasePlayer player, bool local1",
      "TargetName": "BoomBox",
      "MethodName": "ServerTogglePlay",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2840275165,
      "Name": "OnBoomboxStationUpdate",
      "FullName": "OnBoomboxStationUpdate",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "boomBox",
          "typeName": "BoomBox",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a boombox station is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Server_UpdateRadioIP(BaseEntity.RPCMessage msg)\n{\n\tstring text = msg.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"OnBoomboxStationUpdate\", this, text, msg.player) == null && IsStationValid(text))\n\t{\n\t\tif (msg.player != null)\n\t\t{\n\t\t\tulong assignedRadioBy = msg.player.userID.Get();\n\t\t\tAssignedRadioBy = assignedRadioBy;\n\t\t}\n\t\tCurrentRadioIp = text;\n\t\tbase.baseEntity.ClientRPC(RpcTarget.NetworkGroup(\"OnRadioIPChanged\"), CurrentRadioIp);\n\t\tOxide.Core.Interface.CallHook(\"OnBoomboxStationUpdated\", this, text, msg.player);\n\t\tif (IsOn())\n\t\t{\n\t\t\tServerTogglePlay(play: false);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BoomBox boomBox, string local0, BasePlayer player",
      "TargetName": "BoomBox",
      "MethodName": "Server_UpdateRadioIP",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1238374081,
      "Name": "OnBoomboxStationUpdated",
      "FullName": "OnBoomboxStationUpdated",
      "Category": "Radio",
      "Parameters": [
        {
          "name": "boomBox",
          "typeName": "BoomBox",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a boombox station is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Server_UpdateRadioIP(BaseEntity.RPCMessage msg)\n{\n\tstring text = msg.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"OnBoomboxStationUpdate\", this, text, msg.player) == null && IsStationValid(text))\n\t{\n\t\tif (msg.player != null)\n\t\t{\n\t\t\tulong assignedRadioBy = msg.player.userID.Get();\n\t\t\tAssignedRadioBy = assignedRadioBy;\n\t\t}\n\t\tCurrentRadioIp = text;\n\t\tbase.baseEntity.ClientRPC(RpcTarget.NetworkGroup(\"OnRadioIPChanged\"), CurrentRadioIp);\n\t\tOxide.Core.Interface.CallHook(\"OnBoomboxStationUpdated\", this, text, msg.player);\n\t\tif (IsOn())\n\t\t{\n\t\t\tServerTogglePlay(play: false);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BoomBox boomBox, string local0, BasePlayer player",
      "TargetName": "BoomBox",
      "MethodName": "Server_UpdateRadioIP",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Resource": [
    {
      "Id": 2949903609,
      "Name": "OnDispenserGather",
      "FullName": "OnDispenserGather",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "resourceDispenser",
          "typeName": "ResourceDispenser",
          "optional": false
        },
        {
          "name": "entity",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a dispenser gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void GiveResourceFromItem(BasePlayer entity, ItemAmount itemAmt, float gatherDamage, float destroyFraction, AttackEntity attackWeapon)\n{\n\tif (itemAmt.amount == 0f)\n\t{\n\t\treturn;\n\t}\n\tfloat num = UnityEngine.Mathf.Min(gatherDamage, base.baseEntity.Health()) / base.baseEntity.MaxHealth();\n\tfloat num2 = itemAmt.startAmount / startingItemCounts;\n\tfloat f = UnityEngine.Mathf.Clamp(itemAmt.startAmount * num / num2, 0f, itemAmt.amount);\n\tf = UnityEngine.Mathf.Round(f);\n\tfloat num3 = f * destroyFraction * 2f;\n\tif (itemAmt.amount <= f + num3)\n\t{\n\t\tfloat num4 = (f + num3) / itemAmt.amount;\n\t\tf /= num4;\n\t\tnum3 /= num4;\n\t}\n\titemAmt.amount -= UnityEngine.Mathf.Floor(f);\n\titemAmt.amount -= UnityEngine.Mathf.Floor(num3);\n\tif (f < 1f)\n\t{\n\t\tf = ((UnityEngine.Random.Range(0f, 1f) <= f) ? 1f : 0f);\n\t\titemAmt.amount = 0f;\n\t}\n\tif (itemAmt.amount < 0f)\n\t{\n\t\titemAmt.amount = 0f;\n\t}\n\tif (!(f >= 1f))\n\t{\n\t\treturn;\n\t}\n\tint num5 = CalculateGatherBonus(entity, itemAmt, f);\n\tint iAmount = UnityEngine.Mathf.FloorToInt(f) + num5;\n\tItem item = ItemManager.CreateByItemID(itemAmt.itemid, iAmount, 0uL);\n\tif (Oxide.Core.Interface.CallHook(\"OnDispenserGather\", this, entity, item) == null && item != null)\n\t{\n\t\tApplyItemOwnership(entity, item);\n\t\tOverrideOwnership(item, attackWeapon);\n\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, base.baseEntity, entity, attackWeapon);\n\t\tOxide.Core.Interface.CallHook(\"OnDispenserGathered\", this, entity, item);\n\t\twhile (item.amount > item.MaxStackable())\n\t\t{\n\t\t\tItem item2 = item.SplitItem(item.MaxStackable());\n\t\t\tentity.GiveItem(item2, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t\tentity.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t}\n}\n",
      "ParametersText": "ResourceDispenser resourceDispenser, BasePlayer entity, Item local7",
      "TargetName": "ResourceDispenser",
      "MethodName": "GiveResourceFromItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2399681302,
      "Name": "OnDispenserBonus",
      "FullName": "OnDispenserBonus",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "resourceDispenser",
          "typeName": "ResourceDispenser",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when dispenser bonus occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AssignFinishBonus(BasePlayer player, float fraction, AttackEntity weapon)\n{\n\tif (forceFullFinishBonus)\n\t{\n\t\tfraction = 1f;\n\t}\n\tSendMessage(\"FinishBonusAssigned\", UnityEngine.SendMessageOptions.DontRequireReceiver);\n\tif (fraction <= 0f || finishBonus == null)\n\t{\n\t\treturn;\n\t}\n\tforeach (ItemAmount finishBonu in finishBonus)\n\t{\n\t\tint num = UnityEngine.Mathf.CeilToInt((float)(int)finishBonu.amount * UnityEngine.Mathf.Clamp01(fraction));\n\t\tint num2 = CalculateGatherBonus(player, finishBonu, num);\n\t\tItem item = ItemManager.Create(finishBonu.itemDef, num + num2, 0uL);\n\t\tif (item != null)\n\t\t{\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnDispenserBonus\", this, player, item);\n\t\t\tif (obj is Item)\n\t\t\t{\n\t\t\t\titem = (Item)obj;\n\t\t\t}\n\t\t\tApplyItemOwnership(player, item);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, base.baseEntity, player, weapon);\n\t\t\tOxide.Core.Interface.CallHook(\"OnDispenserBonusReceived\", this, player, item);\n\t\t\twhile (item.amount > item.MaxStackable())\n\t\t\t{\n\t\t\t\tItem item2 = item.SplitItem(item.MaxStackable());\n\t\t\t\tplayer.GiveItem(item2, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t\t}\n\t\t\tplayer.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ResourceDispenser resourceDispenser, BasePlayer player, Item local4",
      "TargetName": "ResourceDispenser",
      "MethodName": "AssignFinishBonus",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2805087710,
      "Name": "OnDispenserGathered",
      "FullName": "OnDispenserGathered",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "resourceDispenser",
          "typeName": "ResourceDispenser",
          "optional": false
        },
        {
          "name": "entity",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a dispenser is gathered."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void GiveResourceFromItem(BasePlayer entity, ItemAmount itemAmt, float gatherDamage, float destroyFraction, AttackEntity attackWeapon)\n{\n\tif (itemAmt.amount == 0f)\n\t{\n\t\treturn;\n\t}\n\tfloat num = UnityEngine.Mathf.Min(gatherDamage, base.baseEntity.Health()) / base.baseEntity.MaxHealth();\n\tfloat num2 = itemAmt.startAmount / startingItemCounts;\n\tfloat f = UnityEngine.Mathf.Clamp(itemAmt.startAmount * num / num2, 0f, itemAmt.amount);\n\tf = UnityEngine.Mathf.Round(f);\n\tfloat num3 = f * destroyFraction * 2f;\n\tif (itemAmt.amount <= f + num3)\n\t{\n\t\tfloat num4 = (f + num3) / itemAmt.amount;\n\t\tf /= num4;\n\t\tnum3 /= num4;\n\t}\n\titemAmt.amount -= UnityEngine.Mathf.Floor(f);\n\titemAmt.amount -= UnityEngine.Mathf.Floor(num3);\n\tif (f < 1f)\n\t{\n\t\tf = ((UnityEngine.Random.Range(0f, 1f) <= f) ? 1f : 0f);\n\t\titemAmt.amount = 0f;\n\t}\n\tif (itemAmt.amount < 0f)\n\t{\n\t\titemAmt.amount = 0f;\n\t}\n\tif (!(f >= 1f))\n\t{\n\t\treturn;\n\t}\n\tint num5 = CalculateGatherBonus(entity, itemAmt, f);\n\tint iAmount = UnityEngine.Mathf.FloorToInt(f) + num5;\n\tItem item = ItemManager.CreateByItemID(itemAmt.itemid, iAmount, 0uL);\n\tif (Oxide.Core.Interface.CallHook(\"OnDispenserGather\", this, entity, item) == null && item != null)\n\t{\n\t\tApplyItemOwnership(entity, item);\n\t\tOverrideOwnership(item, attackWeapon);\n\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, base.baseEntity, entity, attackWeapon);\n\t\tOxide.Core.Interface.CallHook(\"OnDispenserGathered\", this, entity, item);\n\t\twhile (item.amount > item.MaxStackable())\n\t\t{\n\t\t\tItem item2 = item.SplitItem(item.MaxStackable());\n\t\t\tentity.GiveItem(item2, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t\tentity.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t}\n}\n",
      "ParametersText": "ResourceDispenser resourceDispenser, BasePlayer entity, Item local7",
      "TargetName": "ResourceDispenser",
      "MethodName": "GiveResourceFromItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2862399138,
      "Name": "OnDispenserBonusReceived",
      "FullName": "OnDispenserBonusReceived",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "resourceDispenser",
          "typeName": "ResourceDispenser",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a dispenser bonus is received."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AssignFinishBonus(BasePlayer player, float fraction, AttackEntity weapon)\n{\n\tif (forceFullFinishBonus)\n\t{\n\t\tfraction = 1f;\n\t}\n\tSendMessage(\"FinishBonusAssigned\", UnityEngine.SendMessageOptions.DontRequireReceiver);\n\tif (fraction <= 0f || finishBonus == null)\n\t{\n\t\treturn;\n\t}\n\tforeach (ItemAmount finishBonu in finishBonus)\n\t{\n\t\tint num = UnityEngine.Mathf.CeilToInt((float)(int)finishBonu.amount * UnityEngine.Mathf.Clamp01(fraction));\n\t\tint num2 = CalculateGatherBonus(player, finishBonu, num);\n\t\tItem item = ItemManager.Create(finishBonu.itemDef, num + num2, 0uL);\n\t\tif (item != null)\n\t\t{\n\t\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnDispenserBonus\", this, player, item);\n\t\t\tif (obj is Item)\n\t\t\t{\n\t\t\t\titem = (Item)obj;\n\t\t\t}\n\t\t\tApplyItemOwnership(player, item);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, base.baseEntity, player, weapon);\n\t\t\tOxide.Core.Interface.CallHook(\"OnDispenserBonusReceived\", this, player, item);\n\t\t\twhile (item.amount > item.MaxStackable())\n\t\t\t{\n\t\t\t\tItem item2 = item.SplitItem(item.MaxStackable());\n\t\t\t\tplayer.GiveItem(item2, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t\t}\n\t\t\tplayer.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ResourceDispenser resourceDispenser, BasePlayer player, Item local4",
      "TargetName": "ResourceDispenser",
      "MethodName": "AssignFinishBonus",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3947927302,
      "Name": "OnSurveyGather",
      "FullName": "OnSurveyGather",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "surveyCharge",
          "typeName": "SurveyCharge",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a survey gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Explode()\n{\n\tbase.Explode();\n\tif (WaterLevel.Test(base.transform.position, waves: true, volumes: true, this))\n\t{\n\t\treturn;\n\t}\n\tResourceDepositManager.ResourceDeposit orCreate = ResourceDepositManager.GetOrCreate(base.transform.position);\n\tif (orCreate == null || UnityEngine.Time.realtimeSinceStartup - orCreate.lastSurveyTime < 10f)\n\t{\n\t\treturn;\n\t}\n\torCreate.lastSurveyTime = UnityEngine.Time.realtimeSinceStartup;\n\tif (!TransformUtil.GetGroundInfo(base.transform.position, out var hitOut, 0.3f, 8388608))\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 point = hitOut.point;\n\t_ = hitOut.normal;\n\tSystem.Collections.Generic.List<SurveyCrater> obj = Facepunch.Pool.Get<System.Collections.Generic.List<SurveyCrater>>();\n\tVis.Entities(base.transform.position, 10f, obj, 1);\n\tbool num = obj.Count > 0;\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n\tif (num)\n\t{\n\t\treturn;\n\t}\n\tbool flag = false;\n\tbool flag2 = false;\n\tforeach (ResourceDepositManager.ResourceDeposit.ResourceDepositEntry resource in orCreate._resources)\n\t{\n\t\tif (resource.spawnType == ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM && !resource.isLiquid && resource.amount >= 1000)\n\t\t{\n\t\t\tint num2 = UnityEngine.Mathf.Clamp(UnityEngine.Mathf.CeilToInt(2.5f / resource.workNeeded * 10f), 0, 5);\n\t\t\tint iAmount = 1;\n\t\t\tflag = true;\n\t\t\tif (resource.isLiquid)\n\t\t\t{\n\t\t\t\tflag2 = true;\n\t\t\t}\n\t\t\tfor (int i = 0; i < num2; i++)\n\t\t\t{\n\t\t\t\tItem item = ItemManager.Create(resource.type, iAmount, 0uL);\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnSurveyGather\", this, item);\n\t\t\t\tUnityEngine.Vector3 modifiedAimConeDirection = AimConeUtil.GetModifiedAimConeDirection(20f, UnityEngine.Vector3.up);\n\t\t\t\titem.Drop(base.transform.position + UnityEngine.Vector3.up * 1f, GetInheritedDropVelocity() + modifiedAimConeDirection * UnityEngine.Random.Range(5f, 10f), UnityEngine.Random.rotation).SetAngularVelocity(UnityEngine.Random.rotation.eulerAngles * 5f);\n\t\t\t}\n\t\t}\n\t}\n\tif (flag)\n\t{\n\t\tstring strPrefab = (flag2 ? craterPrefab_Oil.resourcePath : craterPrefab.resourcePath);\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(strPrefab, point, UnityEngine.Quaternion.identity);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tbaseEntity.Spawn();\n\t\t}\n\t}\n}\n",
      "ParametersText": "SurveyCharge surveyCharge",
      "TargetName": "SurveyCharge",
      "MethodName": "Explode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4140107910,
      "Name": "OnResourceDepositCreated",
      "FullName": "OnResourceDepositCreated",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "ResourceDepositManager+ResourceDeposit",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a resource deposit is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public ResourceDepositManager.ResourceDeposit CreateFromPosition(UnityEngine.Vector3 pos)\n{\n\tVector2i indexFrom = GetIndexFrom(pos);\n\tUnityEngine.Random.State state = UnityEngine.Random.state;\n\tUnityEngine.Random.InitState((int)new UnityEngine.Vector2(indexFrom.x, indexFrom.y).Seed(World.Seed + World.Salt));\n\tResourceDepositManager.ResourceDeposit resourceDeposit = new ResourceDepositManager.ResourceDeposit\n\t{\n\t\torigin = new UnityEngine.Vector3(indexFrom.x * 20, 0f, indexFrom.y * 20)\n\t};\n\tif (UnityEngine.Random.Range(0f, 1f) < 0.5f)\n\t{\n\t\tresourceDeposit.Add(ItemManager.FindItemDefinition(\"stones\"), 1f, 100, 1f, ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM);\n\t}\n\telse\n\t{\n\t\tbool flag = false;\n\t\tfloat num = 0f;\n\t\tif (World.Procedural)\n\t\t{\n\t\t\tif (TerrainMeta.BiomeMap.GetBiome(pos, 1) > 0.5f)\n\t\t\t{\n\t\t\t\tnum += 0.25f;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnum += 0.15f;\n\t\t}\n\t\tif (UnityEngine.Random.Range(0f, 1f) >= 1f - num)\n\t\t{\n\t\t\tresourceDeposit.Add(ItemManager.FindItemDefinition(\"crude.oil\"), 1f, UnityEngine.Random.Range(5000, 10000), UnityEngine.Random.Range(8f, 10f), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM, liquid: true);\n\t\t\tflag = true;\n\t\t}\n\t\tif (!flag)\n\t\t{\n\t\t\tresourceDeposit.Add(ItemManager.FindItemDefinition(\"stones\"), 1f, UnityEngine.Random.Range(30000, 100000), UnityEngine.Random.Range(0.3f, 0.5f), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM);\n\t\t\tfloat num2 = 0f;\n\t\t\tnum2 = ((!World.Procedural) ? 0.1f : (((TerrainMeta.BiomeMap.GetBiome(pos, 2) > 0.5f) ? 1f : 0f) * 0.25f));\n\t\t\tif (UnityEngine.Random.Range(0f, 1f) >= 1f - num2)\n\t\t\t{\n\t\t\t\tresourceDeposit.Add(ItemManager.FindItemDefinition(\"metal.ore\"), 1f, UnityEngine.Random.Range(10000, 100000), UnityEngine.Random.Range(2f, 4f), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM);\n\t\t\t}\n\t\t\tfloat num3 = 0f;\n\t\t\tnum3 = ((!World.Procedural) ? 0.1f : (((TerrainMeta.BiomeMap.GetBiome(pos, 1) > 0.5f) ? 1f : 0f) * (0.25f + 0.25f * (TerrainMeta.TopologyMap.GetTopology(pos, 8) ? 1f : 0f) + 0.25f * (TerrainMeta.TopologyMap.GetTopology(pos, 1) ? 1f : 0f))));\n\t\t\tif (UnityEngine.Random.Range(0f, 1f) >= 1f - num3)\n\t\t\t{\n\t\t\t\tresourceDeposit.Add(ItemManager.FindItemDefinition(\"sulfur.ore\"), 1f, UnityEngine.Random.Range(10000, 100000), UnityEngine.Random.Range(4f, 4f), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM);\n\t\t\t}\n\t\t\tfloat num4 = 0f;\n\t\t\tif (World.Procedural)\n\t\t\t{\n\t\t\t\tif (TerrainMeta.BiomeMap.GetBiome(pos, 8) > 0.5f || TerrainMeta.BiomeMap.GetBiome(pos, 4) > 0.5f)\n\t\t\t\t{\n\t\t\t\t\tnum4 += 0.25f;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tnum4 += 0.15f;\n\t\t\t}\n\t\t\tif (UnityEngine.Random.Range(0f, 1f) >= 1f - num4)\n\t\t\t{\n\t\t\t\tresourceDeposit.Add(ItemManager.FindItemDefinition(\"hq.metal.ore\"), 1f, UnityEngine.Random.Range(5000, 10000), UnityEngine.Random.Range(30f, 50f), ResourceDepositManager.ResourceDeposit.surveySpawnType.ITEM);\n\t\t\t}\n\t\t}\n\t}\n\t_deposits.Add(indexFrom, resourceDeposit);\n\tOxide.Core.Interface.CallHook(\"OnResourceDepositCreated\", resourceDeposit);\n\tUnityEngine.Random.state = state;\n\treturn resourceDeposit;\n}\n",
      "ParametersText": "ResourceDepositManager.ResourceDeposit local1",
      "TargetName": "ResourceDepositManager",
      "MethodName": "CreateFromPosition",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 767976070,
      "Name": "OnLootSpawn",
      "FullName": "OnLootSpawn [LootContainer]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "lootContainer",
          "typeName": "LootContainer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void SpawnLoot()\n{\n\tif (base.IsDestroyed)\n\t{\n\t\treturn;\n\t}\n\tif (base.inventory == null)\n\t{\n\t\tUnityEngine.Debug.Log(\"CONTACT DEVELOPERS! LootContainer::PopulateLoot has null inventory!!!\");\n\t\treturn;\n\t}\n\tbase.inventory.Clear();\n\tItemManager.DoRemoves();\n\tif (Oxide.Core.Interface.CallHook(\"OnLootSpawn\", this) == null)\n\t{\n\t\tPopulateLoot();\n\t\tif (shouldRefreshContents)\n\t\t{\n\t\t\tInvoke(SpawnLoot, UnityEngine.Random.Range(minSecondsBetweenRefresh, maxSecondsBetweenRefresh));\n\t\t}\n\t}\n}\n",
      "ParametersText": "LootContainer lootContainer",
      "TargetName": "LootContainer",
      "MethodName": "SpawnLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3290943891,
      "Name": "OnCollectiblePickup",
      "FullName": "OnCollectiblePickup",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "collectibleEntity",
          "typeName": "CollectibleEntity",
          "optional": false
        },
        {
          "name": "reciever",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "eat",
          "typeName": "System.Boolean",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a collectible is picked up."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoPickup(BasePlayer reciever, bool eat = false)\n{\n\tif (itemList == null || Oxide.Core.Interface.CallHook(\"OnCollectiblePickup\", this, reciever, eat) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((reciever.modifiers != null) ? reciever.modifiers.GetValue(Modifier.ModifierType.Collectible_DoubleYield) : 0f);\n\tbool flag = num != 0f && UnityEngine.Random.value < num;\n\tItemAmount[] array = itemList;\n\tforeach (ItemAmount itemAmount in array)\n\t{\n\t\tif (reciever != null && reciever.IsInTutorial && itemAmount.ignoreInTutorial)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tItem item = ItemManager.Create(itemAmount.itemDef, flag ? ((int)itemAmount.amount * 2) : ((int)itemAmount.amount), 0uL);\n\t\tif (item == null)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\titem.SetItemOwnership(reciever, ItemOwnershipPhrases.GatheredPhrase);\n\t\tif (eat && item.info.category == ItemCategory.Food && reciever != null)\n\t\t{\n\t\t\tItemModConsume component = item.info.GetComponent<ItemModConsume>();\n\t\t\tif (component != null)\n\t\t\t{\n\t\t\t\tcomponent.DoAction(item, reciever);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif ((bool)reciever)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, this, reciever);\n\t\t\tOxide.Core.Interface.CallHook(\"OnCollectiblePickedup\", this, reciever, item);\n\t\t\treciever.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t\telse\n\t\t{\n\t\t\titem.Drop(base.transform.position + UnityEngine.Vector3.up * 0.5f, UnityEngine.Vector3.up);\n\t\t}\n\t}\n\titemList = null;\n\tif (pickupEffect.isValid)\n\t{\n\t\tEffect.server.Run(pickupEffect.resourcePath, base.transform.position, base.transform.up);\n\t}\n\tRandomItemDispenser randomItemDispenser = PrefabAttribute.server.Find<RandomItemDispenser>(prefabID);\n\tif (randomItemDispenser != null)\n\t{\n\t\trandomItemDispenser.DistributeItems(reciever, base.transform.position);\n\t}\n\tKill();\n}\n",
      "ParametersText": "CollectibleEntity collectibleEntity, BasePlayer reciever, bool eat",
      "TargetName": "CollectibleEntity",
      "MethodName": "DoPickup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 93268119,
      "Name": "OnCollectiblePickedup",
      "FullName": "OnCollectiblePickedup",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "collectibleEntity",
          "typeName": "CollectibleEntity",
          "optional": false
        },
        {
          "name": "reciever",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local6",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when collectible pickedup occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoPickup(BasePlayer reciever, bool eat = false)\n{\n\tif (itemList == null || Oxide.Core.Interface.CallHook(\"OnCollectiblePickup\", this, reciever, eat) != null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = ((reciever.modifiers != null) ? reciever.modifiers.GetValue(Modifier.ModifierType.Collectible_DoubleYield) : 0f);\n\tbool flag = num != 0f && UnityEngine.Random.value < num;\n\tItemAmount[] array = itemList;\n\tforeach (ItemAmount itemAmount in array)\n\t{\n\t\tif (reciever != null && reciever.IsInTutorial && itemAmount.ignoreInTutorial)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tItem item = ItemManager.Create(itemAmount.itemDef, flag ? ((int)itemAmount.amount * 2) : ((int)itemAmount.amount), 0uL);\n\t\tif (item == null)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\titem.SetItemOwnership(reciever, ItemOwnershipPhrases.GatheredPhrase);\n\t\tif (eat && item.info.category == ItemCategory.Food && reciever != null)\n\t\t{\n\t\t\tItemModConsume component = item.info.GetComponent<ItemModConsume>();\n\t\t\tif (component != null)\n\t\t\t{\n\t\t\t\tcomponent.DoAction(item, reciever);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif ((bool)reciever)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnGatherItem(item.info.shortname, item.amount, this, reciever);\n\t\t\tOxide.Core.Interface.CallHook(\"OnCollectiblePickedup\", this, reciever, item);\n\t\t\treciever.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t\telse\n\t\t{\n\t\t\titem.Drop(base.transform.position + UnityEngine.Vector3.up * 0.5f, UnityEngine.Vector3.up);\n\t\t}\n\t}\n\titemList = null;\n\tif (pickupEffect.isValid)\n\t{\n\t\tEffect.server.Run(pickupEffect.resourcePath, base.transform.position, base.transform.up);\n\t}\n\tRandomItemDispenser randomItemDispenser = PrefabAttribute.server.Find<RandomItemDispenser>(prefabID);\n\tif (randomItemDispenser != null)\n\t{\n\t\trandomItemDispenser.DistributeItems(reciever, base.transform.position);\n\t}\n\tKill();\n}\n",
      "ParametersText": "CollectibleEntity collectibleEntity, BasePlayer reciever, Item local6",
      "TargetName": "CollectibleEntity",
      "MethodName": "DoPickup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2447060701,
      "Name": "OnExcavatorGather",
      "FullName": "OnExcavatorGather",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "excavatorArm",
          "typeName": "ExcavatorArm",
          "optional": false
        },
        {
          "name": "local8",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an excavator gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ProduceResources()\n{\n\tfloat num = resourceProductionTickRate / timeForFullResources;\n\tfloat num2 = resourcesToMine[resourceMiningIndex].amount * num;\n\tpendingResources[resourceMiningIndex].amount += num2;\n\tItemAmount[] array = pendingResources;\n\tforeach (ItemAmount itemAmount in array)\n\t{\n\t\tif (!(itemAmount.amount >= (float)outputPiles.Count))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tint num3 = UnityEngine.Mathf.FloorToInt(itemAmount.amount / (float)outputPiles.Count);\n\t\titemAmount.amount -= num3 * 2;\n\t\tforeach (ExcavatorOutputPile outputPile in outputPiles)\n\t\t{\n\t\t\tItem item = ItemManager.Create(resourcesToMine[resourceMiningIndex].itemDef, num3, 0uL);\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnExcavatorGather\", this, item) != null)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tFacepunch.Rust.Analytics.Azure.OnExcavatorProduceItem(item, this);\n\t\t\tif (!item.MoveToContainer(outputPile.inventory))\n\t\t\t{\n\t\t\t\titem.Drop(outputPile.GetDropPosition(), outputPile.GetDropVelocity());\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "ExcavatorArm excavatorArm, Item local8",
      "TargetName": "ExcavatorArm",
      "MethodName": "ProduceResources",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3475217791,
      "Name": "OnExcavatorMiningToggled",
      "FullName": "OnExcavatorMiningToggled [start]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "excavatorArm",
          "typeName": "ExcavatorArm",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an excavator mining toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void BeginMining()\n{\n\tif (IsPowered())\n\t{\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tInvokeRepeating(ProduceResources, resourceProductionTickRate, resourceProductionTickRate);\n\t\tif (UnityEngine.Time.time > nextNotificationTime)\n\t\t{\n\t\t\tBasePlayer.Server_SendWorldNotificationToAllActivePlayers(WorldNotificationConfig.NotificationType.ExcavatorBegunMining, base.transform.position);\n\t\t\tnextNotificationTime = UnityEngine.Time.time + 60f;\n\t\t}\n\t\tExcavatorServerEffects.SetMining(isMining: true);\n\t\texcavatorStartTime = GetNetworkTime();\n\t\tOxide.Core.Interface.CallHook(\"OnExcavatorMiningToggled\", this);\n\t}\n}\n",
      "ParametersText": "ExcavatorArm excavatorArm",
      "TargetName": "ExcavatorArm",
      "MethodName": "BeginMining",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3475217791,
      "Name": "OnExcavatorMiningToggled",
      "FullName": "OnExcavatorMiningToggled [stop]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "excavatorArm",
          "typeName": "ExcavatorArm",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an excavator mining toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void StopMining()\n{\n\tExcavatorServerEffects.SetMining(isMining: false);\n\tCancelInvoke(ProduceResources);\n\tSetFlag(BaseEntity.Flags.On, b: false);\n\tOxide.Core.Interface.CallHook(\"OnExcavatorMiningToggled\", this);\n}\n",
      "ParametersText": "ExcavatorArm excavatorArm",
      "TargetName": "ExcavatorArm",
      "MethodName": "StopMining",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 972234103,
      "Name": "OnExcavatorResourceSet",
      "FullName": "OnExcavatorResourceSet",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "excavatorArm",
          "typeName": "ExcavatorArm",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.String",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when excavator resource set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void RPC_SetResourceTarget(BaseEntity.RPCMessage msg)\n{\n\tstring text = msg.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"OnExcavatorResourceSet\", this, text, msg.player) == null)\n\t{\n\t\tswitch (text)\n\t\t{\n\t\tcase \"HQM\":\n\t\t\tresourceMiningIndex = 0;\n\t\t\tbreak;\n\t\tcase \"Sulfur\":\n\t\t\tresourceMiningIndex = 1;\n\t\t\tbreak;\n\t\tcase \"Stone\":\n\t\t\tresourceMiningIndex = 2;\n\t\t\tbreak;\n\t\tcase \"Metal\":\n\t\t\tresourceMiningIndex = 3;\n\t\t\tbreak;\n\t\t}\n\t\tif (!IsOn())\n\t\t{\n\t\t\tBeginMining();\n\t\t}\n\t}\n}\n",
      "ParametersText": "ExcavatorArm excavatorArm, string local0, BasePlayer player",
      "TargetName": "ExcavatorArm",
      "MethodName": "RPC_SetResourceTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2863302180,
      "Name": "OnGrowableGathered",
      "FullName": "OnGrowableGathered",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "growableEntity",
          "typeName": "GrowableEntity",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a growable is gathered."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void GiveFruit(BasePlayer player, int amount, bool eat)\n{\n\tif (amount <= 0)\n\t{\n\t\treturn;\n\t}\n\tbool flag = Properties.pickupItem.condition.enabled;\n\tif (flag)\n\t{\n\t\tfor (int i = 0; i < amount; i++)\n\t\t{\n\t\t\tGiveFruit(player, 1, flag, eat);\n\t\t}\n\t}\n\telse\n\t{\n\t\tGiveFruit(player, amount, flag, eat);\n\t}\n}\n",
      "ParametersText": "GrowableEntity growableEntity, Item local0, BasePlayer player",
      "TargetName": "GrowableEntity",
      "MethodName": "GiveFruit",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1267491132,
      "Name": "OnGrowableGather",
      "FullName": "OnGrowableGather",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "growableEntity",
          "typeName": "GrowableEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a growable gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PickFruit(BasePlayer player, bool eat = false)\n{\n\tif (!CanPick(player) || Oxide.Core.Interface.CallHook(\"OnGrowableGather\", this, player, eat) != null)\n\t{\n\t\treturn;\n\t}\n\tharvests++;\n\tGiveFruit(player, CurrentPickAmount, eat);\n\tRandomItemDispenser randomItemDispenser = PrefabAttribute.server.Find<RandomItemDispenser>(prefabID);\n\tif (randomItemDispenser != null)\n\t{\n\t\trandomItemDispenser.DistributeItems(player, base.transform.position);\n\t}\n\tResetSeason();\n\tif (Properties.pickEffect.isValid)\n\t{\n\t\tEffect.server.Run(Properties.pickEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t}\n\tif (harvests >= Properties.maxHarvests)\n\t{\n\t\tif (Properties.disappearAfterHarvest)\n\t\t{\n\t\t\tTellPlanter();\n\t\t\tDie();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tChangeState(PlantProperties.State.Dying, resetAge: true);\n\t\t}\n\t}\n\telse\n\t{\n\t\tChangeState(PlantProperties.State.Mature, resetAge: true);\n\t}\n}\n",
      "ParametersText": "GrowableEntity growableEntity",
      "TargetName": "GrowableEntity",
      "MethodName": "PickFruit",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1776723751,
      "Name": "OnRemoveDying",
      "FullName": "OnRemoveDying",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "growableEntity",
          "typeName": "GrowableEntity",
          "optional": false
        },
        {
          "name": "receiver",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a remove is dying."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RemoveDying(BasePlayer receiver)\n{\n\tif (State == PlantProperties.State.Dying && !(Properties.removeDyingItem == null) && Oxide.Core.Interface.CallHook(\"OnRemoveDying\", this, receiver) == null)\n\t{\n\t\tif (Properties.removeDyingEffect.isValid)\n\t\t{\n\t\t\tEffect.server.Run(Properties.removeDyingEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\t}\n\t\tItem item = ItemManager.Create(Properties.removeDyingItem, 1, 0uL);\n\t\tif (receiver != null)\n\t\t{\n\t\t\treceiver.GiveItem(item, BaseEntity.GiveItemReason.PickedUp, GiveItemOptions.BackpackOverflow);\n\t\t}\n\t\telse\n\t\t{\n\t\t\titem.Drop(base.transform.position + UnityEngine.Vector3.up * 0.5f, UnityEngine.Vector3.up * 1f);\n\t\t}\n\t\tTellPlanter();\n\t\tDie();\n\t}\n}\n",
      "ParametersText": "GrowableEntity growableEntity, BasePlayer receiver",
      "TargetName": "GrowableEntity",
      "MethodName": "RemoveDying",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3507234587,
      "Name": "OnGrowableStateChange",
      "FullName": "OnGrowableStateChange",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "growableEntity",
          "typeName": "GrowableEntity",
          "optional": false
        },
        {
          "name": "state",
          "typeName": "PlantProperties+State",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a growable state is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ChangeState(PlantProperties.State state, bool resetAge, bool loading = false)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnGrowableStateChange\", this, state) != null || (base.isServer && State == state))\n\t{\n\t\treturn;\n\t}\n\tState = state;\n\tif (!base.isServer)\n\t{\n\t\treturn;\n\t}\n\tif (!loading)\n\t{\n\t\tif (currentStage.resources > 0f)\n\t\t{\n\t\t\tyieldPool = currentStage.yield;\n\t\t}\n\t\tif (state == PlantProperties.State.Crossbreed)\n\t\t{\n\t\t\tif (Properties.CrossBreedEffect.isValid)\n\t\t\t{\n\t\t\t\tEffect.server.Run(Properties.CrossBreedEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\t\t}\n\t\t\tGrowableGenetics.CrossBreed(this);\n\t\t}\n\t\tSendNetworkUpdate();\n\t}\n\tif (resetAge)\n\t{\n\t\tstageAge = 0f;\n\t}\n}\n",
      "ParametersText": "GrowableEntity growableEntity, PlantProperties.State state",
      "TargetName": "GrowableEntity",
      "MethodName": "ChangeState",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1723311060,
      "Name": "OnQuarryConsumeFuel",
      "FullName": "OnQuarryConsumeFuel",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "miningQuarry",
          "typeName": "MiningQuarry",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when quarry consume fuel occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool FuelCheck()\n{\n\tif (pendingWork > 0f)\n\t{\n\t\treturn true;\n\t}\n\tItem item = fuelStoragePrefab.instance.GetComponent<StorageContainer>().inventory.FindItemByItemName(\"diesel_barrel\");\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnQuarryConsumeFuel\", this, item);\n\tif (obj is Item)\n\t{\n\t\titem = (Item)obj;\n\t}\n\tif (item != null && item.amount >= 1)\n\t{\n\t\tpendingWork += workPerFuel;\n\t\tFacepunch.Rust.Analytics.Azure.OnQuarryItem(Facepunch.Rust.Analytics.Azure.ResourceMode.Consumed, item.info.shortname, 1, this);\n\t\titem.UseItem();\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "MiningQuarry miningQuarry, Item local0",
      "TargetName": "MiningQuarry",
      "MethodName": "FuelCheck",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2662773903,
      "Name": "OnQuarryGather",
      "FullName": "OnQuarryGather",
      "Category": "Resource",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void ProcessResources()\n{\n\tif (_linkedDeposit == null || hopperPrefab.instance == null)\n\t{\n\t\treturn;\n\t}\n\tif (!FuelCheck())\n\t{\n\t\tSetOn(isOn: false);\n\t}\n\tfloat num = UnityEngine.Mathf.Min(workToAdd, pendingWork);\n\tpendingWork -= num;\n\tforeach (ResourceDepositManager.ResourceDeposit.ResourceDepositEntry resource in _linkedDeposit._resources)\n\t{\n\t\tif ((!canExtractLiquid && resource.isLiquid) || (!canExtractSolid && !resource.isLiquid))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tfloat workNeeded = resource.workNeeded;\n\t\tint num2 = UnityEngine.Mathf.FloorToInt(resource.workDone / workNeeded);\n\t\tresource.workDone += num;\n\t\tint num3 = UnityEngine.Mathf.FloorToInt(resource.workDone / workNeeded);\n\t\tif (resource.workDone > workNeeded)\n\t\t{\n\t\t\tresource.workDone %= workNeeded;\n\t\t}\n\t\tif (num2 != num3)\n\t\t{\n\t\t\tint iAmount = num3 - num2;\n\t\t\tItem item = ItemManager.Create(resource.type, iAmount, 0uL);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnQuarryItem(Facepunch.Rust.Analytics.Azure.ResourceMode.Produced, item.info.shortname, item.amount, this);\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnQuarryGather\", this, item) != null)\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t}\n\t\t\telse if (!item.MoveToContainer(hopperPrefab.instance.GetComponent<StorageContainer>().inventory))\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t\tSetOn(isOn: false);\n\t\t\t}\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "MiningQuarry",
      "MethodName": "ProcessResources",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1616988590,
      "Name": "OnCoalingTowerStart",
      "FullName": "OnCoalingTowerStart",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "coalingTower",
          "typeName": "CoalingTower",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a coaling tower starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_Unload(BaseEntity.RPCMessage msg)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnCoalingTowerStart\", this, msg.player) == null && !TryUnloadActiveWagon(out var attemptStatus) && msg.player != null)\n\t{\n\t\tClientRPC(RpcTarget.Player(\"ActionFailed\", msg.player), (byte)attemptStatus, arg2: true);\n\t}\n}\n",
      "ParametersText": "CoalingTower coalingTower, BasePlayer player",
      "TargetName": "CoalingTower",
      "MethodName": "RPC_Unload",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2456154146,
      "Name": "OnCoalingTowerGather",
      "FullName": "OnCoalingTowerGather",
      "Category": "Resource",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a coaling tower gathers."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void EmptyTenPercent()\n{\n\tif (!IsPowered())\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.GenericError);\n\t\treturn;\n\t}\n\tif (!HasUnloadableLinedUp)\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.NoTrainCar);\n\t\treturn;\n\t}\n\tTrainCarUnloadable activeUnloadable = GetActiveUnloadable();\n\tif (tcUnloadingNow == null || activeUnloadable != tcUnloadingNow)\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.NoTrainCar);\n\t\treturn;\n\t}\n\tStorageContainer storageContainer = tcUnloadingNow.GetStorageContainer();\n\tif (storageContainer.inventory == null || !TrainWagonLootData.instance.TryGetLootFromIndex(LootTypeIndex, out var lootOption))\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.NoTrainCar);\n\t\treturn;\n\t}\n\tbool flag = tcUnloadingNow.wagonType != TrainCarUnloadable.WagonType.Fuel;\n\tItemContainer itemContainer = null;\n\tPercentFullStorageContainer percentFullStorageContainer = (flag ? GetOreStorage() : GetFuelStorage());\n\tif (percentFullStorageContainer != null)\n\t{\n\t\titemContainer = percentFullStorageContainer.inventory;\n\t}\n\tif (itemContainer == null)\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.GenericError);\n\t\treturn;\n\t}\n\tItemContainer inventory = storageContainer.inventory;\n\tItemContainer newcontainer = itemContainer;\n\tint iAmount = UnityEngine.Mathf.RoundToInt((float)lootOption.maxLootAmount / 10f);\n\tSystem.Collections.Generic.List<Item> obj = Facepunch.Pool.Get<System.Collections.Generic.List<Item>>();\n\tint num = inventory.Take(obj, lootOption.lootItem.itemid, iAmount);\n\tbool flag2 = true;\n\tif (num > 0)\n\t{\n\t\tforeach (Item item in obj)\n\t\t{\n\t\t\tif (tcUnloadingNow.wagonType == TrainCarUnloadable.WagonType.Lootboxes)\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (Oxide.Core.Interface.CallHook(\"OnCoalingTowerGather\", this, item) != null)\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbool flag3 = item.MoveToContainer(newcontainer);\n\t\t\tif (!flag2 || flag3)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\titem.MoveToContainer(inventory);\n\t\t\tflag2 = false;\n\t\t\tbreak;\n\t\t}\n\t}\n\tFacepunch.Pool.Free(ref obj, freeElements: false);\n\tfloat orePercent = tcUnloadingNow.GetOrePercent();\n\tif (orePercent == 0f)\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.NoError);\n\t}\n\telse if (!flag2)\n\t{\n\t\tEndEmptyProcess(CoalingTower.ActionAttemptStatus.OutputIsFull);\n\t}\n\telse if (flag)\n\t{\n\t\ttcUnloadingNow.SetVisualOreLevel(orePercent);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "CoalingTower",
      "MethodName": "EmptyTenPercent",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2397758053,
      "Name": "OnQuarryToggle",
      "FullName": "OnQuarryToggle [on]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "MiningQuarry",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void StartEngine(BaseEntity.RPCMessage msg)\n{\n\tMiningQuarry miningQuarry = GetParentEntity() as MiningQuarry;\n\tif ((bool)miningQuarry && Oxide.Core.Interface.CallHook(\"OnQuarryToggle\", miningQuarry, msg.player) == null)\n\t{\n\t\tminingQuarry.EngineSwitch(isOn: true);\n\t\tOxide.Core.Interface.CallHook(\"OnQuarryToggled\", miningQuarry, msg.player);\n\t}\n}\n",
      "ParametersText": "MiningQuarry local0, BasePlayer player",
      "TargetName": "EngineSwitch",
      "MethodName": "StartEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2397758053,
      "Name": "OnQuarryToggle",
      "FullName": "OnQuarryToggle [off]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "MiningQuarry",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void StopEngine(BaseEntity.RPCMessage msg)\n{\n\tMiningQuarry miningQuarry = GetParentEntity() as MiningQuarry;\n\tif ((bool)miningQuarry && Oxide.Core.Interface.CallHook(\"OnQuarryToggle\", miningQuarry, msg.player) == null)\n\t{\n\t\tminingQuarry.EngineSwitch(isOn: false);\n\t\tOxide.Core.Interface.CallHook(\"OnQuarryToggled\", miningQuarry, msg.player);\n\t}\n}\n",
      "ParametersText": "MiningQuarry local0, BasePlayer player",
      "TargetName": "EngineSwitch",
      "MethodName": "StopEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1754663591,
      "Name": "OnQuarryToggled",
      "FullName": "OnQuarryToggled [off]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "MiningQuarry",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void StopEngine(BaseEntity.RPCMessage msg)\n{\n\tMiningQuarry miningQuarry = GetParentEntity() as MiningQuarry;\n\tif ((bool)miningQuarry && Oxide.Core.Interface.CallHook(\"OnQuarryToggle\", miningQuarry, msg.player) == null)\n\t{\n\t\tminingQuarry.EngineSwitch(isOn: false);\n\t\tOxide.Core.Interface.CallHook(\"OnQuarryToggled\", miningQuarry, msg.player);\n\t}\n}\n",
      "ParametersText": "MiningQuarry local0, BasePlayer player",
      "TargetName": "EngineSwitch",
      "MethodName": "StopEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1754663591,
      "Name": "OnQuarryToggled",
      "FullName": "OnQuarryToggled [on]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "MiningQuarry",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void StartEngine(BaseEntity.RPCMessage msg)\n{\n\tMiningQuarry miningQuarry = GetParentEntity() as MiningQuarry;\n\tif ((bool)miningQuarry && Oxide.Core.Interface.CallHook(\"OnQuarryToggle\", miningQuarry, msg.player) == null)\n\t{\n\t\tminingQuarry.EngineSwitch(isOn: true);\n\t\tOxide.Core.Interface.CallHook(\"OnQuarryToggled\", miningQuarry, msg.player);\n\t}\n}\n",
      "ParametersText": "MiningQuarry local0, BasePlayer player",
      "TargetName": "EngineSwitch",
      "MethodName": "StartEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1754663591,
      "Name": "OnQuarryToggled",
      "FullName": "OnQuarryToggled [off] [patch]",
      "Category": "Resource",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void StopEngine(BaseEntity.RPCMessage msg)\n{\n\tMiningQuarry miningQuarry = GetParentEntity() as MiningQuarry;\n\tif ((bool)miningQuarry && Oxide.Core.Interface.CallHook(\"OnQuarryToggle\", miningQuarry, msg.player) == null)\n\t{\n\t\tminingQuarry.EngineSwitch(isOn: false);\n\t\tOxide.Core.Interface.CallHook(\"OnQuarryToggled\", miningQuarry, msg.player);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "EngineSwitch",
      "MethodName": "StopEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1754663591,
      "Name": "OnQuarryToggled",
      "FullName": "OnQuarryToggled [on] [patch]",
      "Category": "Resource",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a quarry toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void StartEngine(BaseEntity.RPCMessage msg)\n{\n\tMiningQuarry miningQuarry = GetParentEntity() as MiningQuarry;\n\tif ((bool)miningQuarry && Oxide.Core.Interface.CallHook(\"OnQuarryToggle\", miningQuarry, msg.player) == null)\n\t{\n\t\tminingQuarry.EngineSwitch(isOn: true);\n\t\tOxide.Core.Interface.CallHook(\"OnQuarryToggled\", miningQuarry, msg.player);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "EngineSwitch",
      "MethodName": "StartEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 767976070,
      "Name": "OnLootSpawn",
      "FullName": "OnLootSpawn [LootFill]",
      "Category": "Resource",
      "Parameters": [
        {
          "name": "lootFill",
          "typeName": "LootFill",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a loot is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void DelayFill()\n{\n\tif (StorageContainer == null || Oxide.Core.Interface.CallHook(\"OnLootSpawn\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tif (LootSpawnSlots.Length != 0)\n\t{\n\t\tLootContainer.LootSpawnSlot[] lootSpawnSlots = LootSpawnSlots;\n\t\tfor (int i = 0; i < lootSpawnSlots.Length; i++)\n\t\t{\n\t\t\tLootContainer.LootSpawnSlot lootSpawnSlot = lootSpawnSlots[i];\n\t\t\tif (lootSpawnSlot.eras != null && lootSpawnSlot.eras.Length != 0 && System.Array.IndexOf(lootSpawnSlot.eras, ConVar.Server.Era) == -1)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tfor (int j = 0; j < lootSpawnSlot.numberToSpawn; j++)\n\t\t\t{\n\t\t\t\tif (UnityEngine.Random.Range(0f, 1f) <= lootSpawnSlot.probability)\n\t\t\t\t{\n\t\t\t\t\tlootSpawnSlot.definition.SpawnIntoContainer(StorageContainer.inventory);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\telse if (LootDefinition != null)\n\t{\n\t\tfor (int k = 0; k < MaxDefinitionsToSpawn; k++)\n\t\t{\n\t\t\tLootDefinition.SpawnIntoContainer(StorageContainer.inventory);\n\t\t}\n\t}\n}\n",
      "ParametersText": "LootFill lootFill",
      "TargetName": "LootFill",
      "MethodName": "DelayFill",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2013835536,
      "Name": "OnRandomItemAward",
      "FullName": "OnRandomItemAward",
      "Category": "Resource",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when random item award occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool TryAward(RandomItemDispenser.RandomItemChance itemChance, BasePlayer forPlayer, UnityEngine.Vector3 distributorPosition)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnRandomItemAward\", this, itemChance, forPlayer, distributorPosition) != null)\n\t{\n\t\treturn false;\n\t}\n\tfloat num = UnityEngine.Random.Range(0f, 1f);\n\tif (itemChance.Chance >= num)\n\t{\n\t\tItem item = ItemManager.Create(itemChance.Item, itemChance.Amount, 0uL);\n\t\tif (item != null)\n\t\t{\n\t\t\titem.SetItemOwnership(forPlayer, ItemOwnershipPhrases.GatheredPhrase);\n\t\t\tif ((bool)forPlayer)\n\t\t\t{\n\t\t\t\tforPlayer.GiveItem(item, BaseEntity.GiveItemReason.ResourceHarvested);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\titem.Drop(distributorPosition + UnityEngine.Vector3.up * 0.5f, UnityEngine.Vector3.up);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "RandomItemDispenser",
      "MethodName": "TryAward",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Seasonal": [
    {
      "Id": 2685341751,
      "Name": "OnXmasLootDistribute",
      "FullName": "OnXmasLootDistribute",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "xMasRefill",
          "typeName": "XMasRefill",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when xmas loot distribute occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ServerInit()\n{\n\tbase.ServerInit();\n\tif (!ConVar.XMas.enabled)\n\t{\n\t\tInvoke(RemoveMe, 0.1f);\n\t\treturn;\n\t}\n\tgoodKids = ((BasePlayer.activePlayerList != null) ? new System.Collections.Generic.List<BasePlayer>(BasePlayer.activePlayerList) : new System.Collections.Generic.List<BasePlayer>());\n\tstockings = ((Stocking.stockings != null) ? new System.Collections.Generic.List<Stocking>(Stocking.stockings.Values) : new System.Collections.Generic.List<Stocking>());\n\tInvoke(RemoveMe, 60f);\n\tif (Oxide.Core.Interface.CallHook(\"OnXmasLootDistribute\", this) == null)\n\t{\n\t\tInvokeRepeating(DistributeLoot, 3f, 0.02f);\n\t\tInvoke(SendBells, 0.5f);\n\t}\n}\n",
      "ParametersText": "XMasRefill xMasRefill",
      "TargetName": "XMasRefill",
      "MethodName": "ServerInit",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 39883610,
      "Name": "OnXmasGiftsDistribute",
      "FullName": "OnXmasGiftsDistribute",
      "Category": "Seasonal",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when xmas gifts distribute occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool DistributeGiftsForPlayer(BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnXmasGiftsDistribute\", this, player) != null)\n\t{\n\t\treturn false;\n\t}\n\tint num = GiftsPerPlayer();\n\tint num2 = GiftSpawnAttempts();\n\tfor (int i = 0; i < num2; i++)\n\t{\n\t\tif (num <= 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tUnityEngine.Vector2 vector = UnityEngine.Random.insideUnitCircle * GiftRadius();\n\t\tUnityEngine.Vector3 pos = player.transform.position + new UnityEngine.Vector3(vector.x, 10f, vector.y);\n\t\tUnityEngine.Quaternion rot = UnityEngine.Quaternion.Euler(0f, UnityEngine.Random.Range(0f, 360f), 0f);\n\t\tif (DropToGround(ref pos))\n\t\t{\n\t\t\tstring resourcePath = giftPrefabs[UnityEngine.Random.Range(0, giftPrefabs.Length)].resourcePath;\n\t\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(resourcePath, pos, rot);\n\t\t\tif ((bool)baseEntity)\n\t\t\t{\n\t\t\t\tbaseEntity.Spawn();\n\t\t\t\tnum--;\n\t\t\t}\n\t\t}\n\t}\n\treturn true;\n}\n",
      "ParametersText": "",
      "TargetName": "XMasRefill",
      "MethodName": "DistributeGiftsForPlayer",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2445742731,
      "Name": "OnXmasStockingFill",
      "FullName": "OnXmasStockingFill",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "stocking",
          "typeName": "Stocking",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a xmas stocking is filled."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void SpawnLoot()\n{\n\tif (base.inventory == null)\n\t{\n\t\tUnityEngine.Debug.Log(\"CONTACT DEVELOPERS! Stocking::PopulateLoot has null inventory!!! \" + base.name);\n\t}\n\telse if (IsEmpty() && Oxide.Core.Interface.CallHook(\"OnXmasStockingFill\", this) == null)\n\t{\n\t\tbase.SpawnLoot();\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tHurt(MaxHealth() * 0.1f, Rust.DamageType.Generic, null, useProtection: false);\n\t}\n}\n",
      "ParametersText": "Stocking stocking",
      "TargetName": "Stocking",
      "MethodName": "SpawnLoot",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2572515364,
      "Name": "OnAdventGiftAward",
      "FullName": "OnAdventGiftAward",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "adventCalendar",
          "typeName": "AdventCalendar",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when advent gift award occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AwardGift(BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnAdventGiftAward\", this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.DateTime now = System.DateTime.Now;\n\tint num = ((overrideAdventCalendarDay > 0) ? overrideAdventCalendarDay : now.Day) - startDay;\n\tif (((overrideAdventCalendarMonth > 0) ? overrideAdventCalendarMonth : now.Month) != startMonth || num < 0 || num >= days.Length)\n\t{\n\t\treturn;\n\t}\n\tif (!playerRewardHistory.ContainsKey(player.userID))\n\t{\n\t\tplayerRewardHistory.Add(player.userID, new System.Collections.Generic.List<int>());\n\t}\n\tplayerRewardHistory[player.userID].Add(num);\n\tEffect.server.Run(giftEffect.resourcePath, player.transform.position);\n\tif (num >= 0 && num < crosses.Length)\n\t{\n\t\tEffect.server.Run(boxCloseEffect.resourcePath, base.transform.position + UnityEngine.Vector3.up * 1.5f);\n\t}\n\tAdventCalendar.DayReward dayReward = days[num];\n\tItemAmount[] rewards = dayReward.rewards;\n\tif (ConVar.Server.Era != 0 && dayReward.alternativeRewards != null)\n\t{\n\t\tAdventCalendar.AlternativeReward[] alternativeRewards = dayReward.alternativeRewards;\n\t\tforeach (AdventCalendar.AlternativeReward alternativeReward in alternativeRewards)\n\t\t{\n\t\t\tif (alternativeReward.era == ConVar.Server.Era)\n\t\t\t{\n\t\t\t\trewards = alternativeReward.rewards;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tforeach (ItemAmount itemAmount in rewards)\n\t{\n\t\tif (itemAmount.itemDef.IsAllowed(Rust.EraRestriction.Loot))\n\t\t{\n\t\t\tplayer.GiveItem(ItemManager.CreateByItemID(itemAmount.itemid, UnityEngine.Mathf.CeilToInt(itemAmount.amount), 0uL).SetItemOwnership(player, ItemOwnershipPhrases.AdventCalendar), BaseEntity.GiveItemReason.PickedUp);\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnAdventGiftAwarded\", this, player);\n}\n",
      "ParametersText": "AdventCalendar adventCalendar",
      "TargetName": "AdventCalendar",
      "MethodName": "AwardGift",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1624765317,
      "Name": "OnAdventGiftAwarded",
      "FullName": "OnAdventGiftAwarded",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "adventCalendar",
          "typeName": "AdventCalendar",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an advent gift is awarded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void AwardGift(BasePlayer player)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnAdventGiftAward\", this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tSystem.DateTime now = System.DateTime.Now;\n\tint num = ((overrideAdventCalendarDay > 0) ? overrideAdventCalendarDay : now.Day) - startDay;\n\tif (((overrideAdventCalendarMonth > 0) ? overrideAdventCalendarMonth : now.Month) != startMonth || num < 0 || num >= days.Length)\n\t{\n\t\treturn;\n\t}\n\tif (!playerRewardHistory.ContainsKey(player.userID))\n\t{\n\t\tplayerRewardHistory.Add(player.userID, new System.Collections.Generic.List<int>());\n\t}\n\tplayerRewardHistory[player.userID].Add(num);\n\tEffect.server.Run(giftEffect.resourcePath, player.transform.position);\n\tif (num >= 0 && num < crosses.Length)\n\t{\n\t\tEffect.server.Run(boxCloseEffect.resourcePath, base.transform.position + UnityEngine.Vector3.up * 1.5f);\n\t}\n\tAdventCalendar.DayReward dayReward = days[num];\n\tItemAmount[] rewards = dayReward.rewards;\n\tif (ConVar.Server.Era != 0 && dayReward.alternativeRewards != null)\n\t{\n\t\tAdventCalendar.AlternativeReward[] alternativeRewards = dayReward.alternativeRewards;\n\t\tforeach (AdventCalendar.AlternativeReward alternativeReward in alternativeRewards)\n\t\t{\n\t\t\tif (alternativeReward.era == ConVar.Server.Era)\n\t\t\t{\n\t\t\t\trewards = alternativeReward.rewards;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tforeach (ItemAmount itemAmount in rewards)\n\t{\n\t\tif (itemAmount.itemDef.IsAllowed(Rust.EraRestriction.Loot))\n\t\t{\n\t\t\tplayer.GiveItem(ItemManager.CreateByItemID(itemAmount.itemid, UnityEngine.Mathf.CeilToInt(itemAmount.amount), 0uL).SetItemOwnership(player, ItemOwnershipPhrases.AdventCalendar), BaseEntity.GiveItemReason.PickedUp);\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnAdventGiftAwarded\", this, player);\n}\n",
      "ParametersText": "AdventCalendar adventCalendar",
      "TargetName": "AdventCalendar",
      "MethodName": "AwardGift",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2402893868,
      "Name": "CanBeAwardedAdventGift",
      "FullName": "CanBeAwardedAdventGift",
      "Category": "Seasonal",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be awarded advent gift.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool WasAwardedTodaysGift(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeAwardedAdventGift\", this, player);\n\tif (obj is bool)\n\t{\n\t\treturn !(bool)obj;\n\t}\n\tif (!playerRewardHistory.ContainsKey(player.userID))\n\t{\n\t\treturn false;\n\t}\n\tSystem.DateTime now = System.DateTime.Now;\n\tif (((overrideAdventCalendarMonth > 0) ? overrideAdventCalendarMonth : now.Month) != startMonth)\n\t{\n\t\treturn true;\n\t}\n\tint num = ((overrideAdventCalendarDay > 0) ? overrideAdventCalendarDay : now.Day) - startDay;\n\tif (num < 0 || num >= days.Length)\n\t{\n\t\treturn true;\n\t}\n\tif (playerRewardHistory[player.userID].Contains(num))\n\t{\n\t\treturn true;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "",
      "TargetName": "AdventCalendar",
      "MethodName": "WasAwardedTodaysGift",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4288346836,
      "Name": "OnEventCollectablePickup",
      "FullName": "OnEventCollectablePickup",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "collectableEasterEgg",
          "typeName": "CollectableEasterEgg",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an event collectable is picked up."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_PickUp(BaseEntity.RPCMessage msg)\n{\n\tif (msg.player == null)\n\t{\n\t\treturn;\n\t}\n\tfloat num = UnityEngine.Time.realtimeSinceStartup - lastPickupStartTime;\n\tif (!(msg.player.GetHeldEntity() as EasterBasket) && (num > 2f || num < 0.8f))\n\t{\n\t\treturn;\n\t}\n\tif ((bool)EggHuntEvent.serverEvent)\n\t{\n\t\tif (!EggHuntEvent.serverEvent.IsEventActive() || Oxide.Core.Interface.CallHook(\"OnEventCollectablePickup\", msg.player, this) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tEggHuntEvent.serverEvent.OnEggCollected(msg.player, this);\n\t\tint iAmount = 1;\n\t\tmsg.player.GiveItem(ItemManager.Create(itemToGive, iAmount, 0uL));\n\t}\n\tEffect.server.Run(pickupEffect.resourcePath, base.transform.position + UnityEngine.Vector3.up * 0.3f, UnityEngine.Vector3.up);\n\tKill();\n}\n",
      "ParametersText": "BasePlayer player, CollectableEasterEgg collectableEasterEgg",
      "TargetName": "CollectableEasterEgg",
      "MethodName": "RPC_PickUp",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 240697297,
      "Name": "OnHuntEventStart",
      "FullName": "OnHuntEventStart",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "eggHuntEvent",
          "typeName": "EggHuntEvent",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a hunt event starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void StartEvent()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHuntEventStart\", this) == null)\n\t{\n\t\tint count = BasePlayer.activePlayerList.Count;\n\t\tif (includeBots)\n\t\t{\n\t\t\tcount = GetCombinedPlayerList(wantBots: true).Count;\n\t\t}\n\t\tif (initialSpawnIndex <= count)\n\t\t{\n\t\t\teggSpawningFrameBudget = float.PositiveInfinity;\n\t\t}\n\t\tEnableEggs();\n\t}\n}\n",
      "ParametersText": "EggHuntEvent eggHuntEvent",
      "TargetName": "EggHuntEvent",
      "MethodName": "StartEvent",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 261230988,
      "Name": "OnHuntEventEnd",
      "FullName": "OnHuntEventEnd",
      "Category": "Seasonal",
      "Parameters": [
        {
          "name": "eggHuntEvent",
          "typeName": "EggHuntEvent",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a hunt event ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Update()\n{\n\ttimeAlive += UnityEngine.Time.deltaTime;\n\tif (base.isServer && !base.IsDestroyed)\n\t{\n\t\tif (timeAlive - warmupTime > durationSeconds - warnTime)\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\t}\n\t\tif (timeAlive - warmupTime > durationSeconds && !IsInvoking(Cooldown) && Oxide.Core.Interface.CallHook(\"OnHuntEventEnd\", this) == null)\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved2, b: true);\n\t\t\tCleanupEggs();\n\t\t\tPrintWinnersAndAward();\n\t\t\tInvoke(Cooldown, 10f);\n\t\t}\n\t}\n}\n",
      "ParametersText": "EggHuntEvent eggHuntEvent",
      "TargetName": "EggHuntEvent",
      "MethodName": "Update",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Shop": [
    {
      "Id": 342722782,
      "Name": "OnShopCompleteTrade",
      "FullName": "OnShopCompleteTrade",
      "Category": "Shop",
      "Parameters": [
        {
          "name": "shopFront",
          "typeName": "ShopFront",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when shop complete trade occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void CompleteTrade()\n{\n\tif (vendorPlayer != null && customerPlayer != null && HasFlag(BaseEntity.Flags.Reserved1) && HasFlag(BaseEntity.Flags.Reserved2))\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnShopCompleteTrade\", this) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\ttry\n\t\t{\n\t\t\tswappingItems = true;\n\t\t\tfor (int num = vendorInventory.capacity - 1; num >= 0; num--)\n\t\t\t{\n\t\t\t\tItem slot = vendorInventory.GetSlot(num);\n\t\t\t\tItem slot2 = customerInventory.GetSlot(num);\n\t\t\t\tif ((bool)customerPlayer && slot != null)\n\t\t\t\t{\n\t\t\t\t\tcustomerPlayer.GiveItem(slot);\n\t\t\t\t}\n\t\t\t\tif ((bool)vendorPlayer && slot2 != null)\n\t\t\t\t{\n\t\t\t\t\tvendorPlayer.GiveItem(slot2);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfinally\n\t\t{\n\t\t\tswappingItems = false;\n\t\t}\n\t\tEffect.server.Run(transactionCompleteEffect.resourcePath, this, 0u, new UnityEngine.Vector3(0f, 1f, 0f), UnityEngine.Vector3.zero);\n\t}\n\tResetTrade();\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "ShopFront shopFront",
      "TargetName": "ShopFront",
      "MethodName": "CompleteTrade",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2935807494,
      "Name": "OnShopAcceptClick",
      "FullName": "OnShopAcceptClick",
      "Category": "Shop",
      "Parameters": [
        {
          "name": "shopFront",
          "typeName": "ShopFront",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when shop accept click occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void AcceptClicked(BaseEntity.RPCMessage msg)\n{\n\tif (IsTradingPlayer(msg.player) && !(vendorPlayer == null) && !(customerPlayer == null) && Oxide.Core.Interface.CallHook(\"OnShopAcceptClick\", this, msg.player) == null)\n\t{\n\t\tif (IsPlayerVendor(msg.player))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved1, b: true);\n\t\t\tvendorInventory.SetLocked(isLocked: true);\n\t\t}\n\t\telse if (IsPlayerCustomer(msg.player))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved2, b: true);\n\t\t\tcustomerInventory.SetLocked(isLocked: true);\n\t\t}\n\t\tif (HasFlag(BaseEntity.Flags.Reserved1) && HasFlag(BaseEntity.Flags.Reserved2))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved3, b: true);\n\t\t\tInvoke(CompleteTrade, 2f);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ShopFront shopFront, BasePlayer player",
      "TargetName": "ShopFront",
      "MethodName": "AcceptClicked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3131054551,
      "Name": "OnShopCancelClick",
      "FullName": "OnShopCancelClick",
      "Category": "Shop",
      "Parameters": [
        {
          "name": "shopFront",
          "typeName": "ShopFront",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when shop cancel click occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void CancelClicked(BaseEntity.RPCMessage msg)\n{\n\tif (IsTradingPlayer(msg.player) && Oxide.Core.Interface.CallHook(\"OnShopCancelClick\", this, msg.player) == null)\n\t{\n\t\t_ = (bool)vendorPlayer;\n\t\t_ = (bool)customerPlayer;\n\t\tResetTrade();\n\t}\n}\n",
      "ParametersText": "ShopFront shopFront, BasePlayer player",
      "TargetName": "ShopFront",
      "MethodName": "CancelClicked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Team": [
    {
      "Id": 2721988387,
      "Name": "OnTeamCreate",
      "FullName": "OnTeamCreate",
      "Category": "Team",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\nprivate void TryCreateTeam(BaseEntity.RPCMessage rpc)\n{\n\tif (maxTeamSize != 0)\n\t{\n\t\tTryCreateTeam(rpc.player);\n\t}\n}\n",
      "ParametersText": "BasePlayer player",
      "TargetName": "RelationshipManager",
      "MethodName": "TryCreateTeam",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1844985686,
      "Name": "OnTeamRejectInvite",
      "FullName": "OnTeamRejectInvite",
      "Category": "Team",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team reject is invited."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerUserVar]\npublic static void rejectinvite(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (!(basePlayer == null) && basePlayer.currentTeam == 0L)\n\t{\n\t\tulong uLong = arg.GetULong(0, 0uL);\n\t\tRelationshipManager.PlayerTeam playerTeam = ServerInstance.FindTeam(uLong);\n\t\tif (playerTeam == null)\n\t\t{\n\t\t\tbasePlayer.ClearPendingInvite();\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnTeamRejectInvite\", basePlayer, playerTeam) == null)\n\t\t{\n\t\t\tplayerTeam.RejectInvite(basePlayer);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, RelationshipManager.PlayerTeam local2",
      "TargetName": "RelationshipManager",
      "MethodName": "rejectinvite",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2913633678,
      "Name": "OnTeamLeave",
      "FullName": "OnTeamLeave",
      "Category": "Team",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team leaves."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerUserVar]\npublic static void leaveteam(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (!(basePlayer == null) && basePlayer.currentTeam != 0L)\n\t{\n\t\tRelationshipManager.PlayerTeam playerTeam = ServerInstance.FindTeam(basePlayer.currentTeam);\n\t\tif (playerTeam != null && Oxide.Core.Interface.CallHook(\"OnTeamLeave\", playerTeam, basePlayer) == null)\n\t\t{\n\t\t\tplayerTeam.RemovePlayer(basePlayer.userID);\n\t\t\tbasePlayer.ClearTeam();\n\t\t}\n\t}\n}\n",
      "ParametersText": "RelationshipManager.PlayerTeam local1, BasePlayer local0",
      "TargetName": "RelationshipManager",
      "MethodName": "leaveteam",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3265417256,
      "Name": "OnTeamKick",
      "FullName": "OnTeamKick",
      "Category": "Team",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team kicks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerUserVar]\npublic static void kickmember(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (basePlayer == null)\n\t{\n\t\treturn;\n\t}\n\tRelationshipManager.PlayerTeam playerTeam = ServerInstance.FindTeam(basePlayer.currentTeam);\n\tif (playerTeam != null && !(playerTeam.GetLeader() != basePlayer))\n\t{\n\t\tulong uLong = arg.GetULong(0, 0uL);\n\t\tif ((ulong)basePlayer.userID != uLong && Oxide.Core.Interface.CallHook(\"OnTeamKick\", playerTeam, basePlayer, uLong) == null)\n\t\t{\n\t\t\tplayerTeam.RemovePlayer(uLong);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RelationshipManager.PlayerTeam local1, BasePlayer local0, ulong local2",
      "TargetName": "RelationshipManager",
      "MethodName": "kickmember",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2723952333,
      "Name": "OnTeamAcceptInvite",
      "FullName": "OnTeamAcceptInvite",
      "Category": "Team",
      "Parameters": [
        {
          "name": "local2",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team accept is invited."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerUserVar]\npublic static void acceptinvite(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tif (!(basePlayer == null) && basePlayer.currentTeam == 0L)\n\t{\n\t\tulong uLong = arg.GetULong(0, 0uL);\n\t\tRelationshipManager.PlayerTeam playerTeam = ServerInstance.FindTeam(uLong);\n\t\tif (playerTeam == null)\n\t\t{\n\t\t\tbasePlayer.ClearPendingInvite();\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnTeamAcceptInvite\", playerTeam, basePlayer) == null)\n\t\t{\n\t\t\tplayerTeam.AcceptInvite(basePlayer);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RelationshipManager.PlayerTeam local2, BasePlayer local0",
      "TargetName": "RelationshipManager",
      "MethodName": "acceptinvite",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2528539314,
      "Name": "OnTeamDisband",
      "FullName": "OnTeamDisband",
      "Category": "Team",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when team disband occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DisbandTeam(RelationshipManager.PlayerTeam teamToDisband)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnTeamDisband\", teamToDisband) == null)\n\t{\n\t\tteams.Remove(teamToDisband.teamID);\n\t\tOxide.Core.Interface.CallHook(\"OnTeamDisbanded\", teamToDisband);\n\t\tFacepunch.Pool.Free(ref teamToDisband);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "RelationshipManager",
      "MethodName": "DisbandTeam",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4221161380,
      "Name": "OnTeamCreated",
      "FullName": "OnTeamCreated",
      "Category": "Team",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.CallsPerSecond(1uL)]\nprivate void TryCreateTeam(BaseEntity.RPCMessage rpc)\n{\n\tif (maxTeamSize != 0)\n\t{\n\t\tTryCreateTeam(rpc.player);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, RelationshipManager.PlayerTeam local0",
      "TargetName": "RelationshipManager",
      "MethodName": "TryCreateTeam",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 197406368,
      "Name": "OnTeamDisbanded",
      "FullName": "OnTeamDisbanded",
      "Category": "Team",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a team is disbanded."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DisbandTeam(RelationshipManager.PlayerTeam teamToDisband)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnTeamDisband\", teamToDisband) == null)\n\t{\n\t\tteams.Remove(teamToDisband.teamID);\n\t\tOxide.Core.Interface.CallHook(\"OnTeamDisbanded\", teamToDisband);\n\t\tFacepunch.Pool.Free(ref teamToDisband);\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "RelationshipManager",
      "MethodName": "DisbandTeam",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 844539354,
      "Name": "OnTeamMemberInvite",
      "FullName": "OnTeamMemberInvite [sendofflineinvite]",
      "Category": "Team",
      "Parameters": [
        {
          "name": "local1",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "System.UInt64",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team member is invited."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerUserVar]\npublic static void sendofflineinvite(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tRelationshipManager.PlayerTeam playerTeam = ServerInstance.FindTeam(basePlayer.currentTeam);\n\tif (playerTeam == null || playerTeam.GetLeader() == null || playerTeam.GetLeader() != basePlayer)\n\t{\n\t\treturn;\n\t}\n\tulong uLong = arg.GetULong(0, 0uL);\n\tif (uLong != 0L)\n\t{\n\t\tBasePlayer basePlayer2 = BasePlayer.FindAwakeOrSleepingByID(uLong);\n\t\tif (basePlayer2 != null && !basePlayer2.GetInfoBool(\"client.allowteaminvitesremoteplayers\", defaultVal: true))\n\t\t{\n\t\t\tbasePlayer.ShowToast(GameTip.Styles.Error, RemoteInvitesBlocked, false);\n\t\t}\n\t\telse if ((basePlayer2 == null || (!basePlayer2.IsNpc && basePlayer2.currentTeam == 0L)) && Oxide.Core.Interface.CallHook(\"OnTeamMemberInvite\", playerTeam, basePlayer, uLong, true) == null)\n\t\t{\n\t\t\tplayerTeam.SendInvite(basePlayer2, uLong);\n\t\t}\n\t}\n}\n",
      "ParametersText": "RelationshipManager.PlayerTeam local1, BasePlayer local0, ulong local2",
      "TargetName": "RelationshipManager",
      "MethodName": "sendofflineinvite",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 844539354,
      "Name": "OnTeamMemberInvite",
      "FullName": "OnTeamMemberInvite [sendinvite]",
      "Category": "Team",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a team member is invited."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerUserVar]\npublic static void sendinvite(ConsoleSystem.Arg arg)\n{\n\tBasePlayer basePlayer = UnityEngine.ArgEx.Player(arg);\n\tRelationshipManager.PlayerTeam playerTeam = ServerInstance.FindTeam(basePlayer.currentTeam);\n\tif (playerTeam == null || playerTeam.GetLeader() == null || playerTeam.GetLeader() != basePlayer)\n\t{\n\t\treturn;\n\t}\n\tulong uLong = arg.GetULong(0, 0uL);\n\tif (uLong == 0L)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer basePlayer2 = BaseNetworkable.serverEntities.Find(new NetworkableId(uLong)) as BasePlayer;\n\tif ((bool)basePlayer2 && basePlayer2 != basePlayer && !basePlayer2.IsNpc && basePlayer2.currentTeam == 0L)\n\t{\n\t\tfloat num = 7f;\n\t\tif (!(UnityEngine.Vector3.Distance(basePlayer2.transform.position, basePlayer.transform.position) > num) && Oxide.Core.Interface.CallHook(\"OnTeamMemberInvite\", playerTeam, basePlayer, basePlayer2.userID.Get(), false) == null)\n\t\t{\n\t\t\tplayerTeam.SendInvite(basePlayer2);\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "RelationshipManager",
      "MethodName": "sendinvite",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1613227947,
      "Name": "OnTeamUpdate",
      "FullName": "OnTeamUpdate",
      "Category": "Team",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "newTeam",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateTeam(ulong newTeam)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnTeamUpdate\", currentTeam, newTeam, this) == null)\n\t{\n\t\tcurrentTeam = newTeam;\n\t\tSendNetworkUpdate();\n\t\tif (RelationshipManager.ServerInstance.FindTeam(newTeam) == null)\n\t\t{\n\t\t\tClearTeam();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tTeamUpdate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, ulong newTeam, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "UpdateTeam",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1173491625,
      "Name": "OnTeamUpdated",
      "FullName": "OnTeamUpdated",
      "Category": "Team",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "ProtoBuf.PlayerTeam",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TeamUpdate()\n{\n\tTeamUpdate(fullTeamUpdate: false);\n}\n",
      "ParametersText": "BasePlayer basePlayer, ProtoBuf.PlayerTeam local3, BasePlayer self1",
      "TargetName": "BasePlayer",
      "MethodName": "TeamUpdate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1658239813,
      "Name": "OnTeamMemberPromote",
      "FullName": "OnTeamMemberPromote",
      "Category": "Team",
      "Parameters": [
        {
          "name": "relationshipManager+PlayerTeam",
          "typeName": "RelationshipManager+PlayerTeam",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a team member promotes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "RelationshipManager.PlayerTeam relationshipManager+PlayerTeam",
      "TargetName": "RelationshipManager/PlayerTeam",
      "MethodName": "SetTeamLeader",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "TechTree": [
    {
      "Id": 2247999116,
      "Name": "OnTechTreeNodeUnlock",
      "FullName": "OnTechTreeNodeUnlock",
      "Category": "TechTree",
      "Parameters": [
        {
          "name": "workbench",
          "typeName": "Workbench",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "TechTreeData+NodeInstance",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a tech tree node is unlocked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_TechTreeUnlock(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tint id = msg.read.Int32();\n\tint level = msg.read.Int32();\n\tbool flag = msg.read.Bit();\n\tTechTreeData techTreeForLevel = GetTechTreeForLevel(level);\n\tif (techTreeForLevel == null || player.currentCraftLevel <= (float)techTreeForLevel.techTreeLevel || player.IsInTutorial || (flag && !HasTechTreeBypassUpgrade()))\n\t{\n\t\treturn;\n\t}\n\tTechTreeData.NodeInstance byID = techTreeForLevel.GetByID(id);\n\tif (byID == null)\n\t{\n\t\tUnityEngine.Debug.Log(\"Node for unlock not found :\" + id);\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnTechTreeNodeUnlock\", this, byID, player) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint itemid = ItemManager.FindItemDefinition(\"scrap\").itemid;\n\t\tint amount = player.inventory.GetAmount(itemid);\n\t\tif (!flag)\n\t\t{\n\t\t\tusing (PooledList<TechTreeData.NodeInstance> pooledList = Facepunch.Pool.Get<PooledList<TechTreeData.NodeInstance>>())\n\t\t\t{\n\t\t\t\ttechTreeForLevel.GetNodesRequiredToUnlock(player, byID, pooledList);\n\t\t\t\tfor (int num = pooledList.Count - 1; num >= 0; num--)\n\t\t\t\t{\n\t\t\t\t\tTechTreeData.NodeInstance nodeInstance = pooledList[num];\n\t\t\t\t\tif (nodeInstance.itemDef == null || player.blueprints.HasUnlocked(nodeInstance.itemDef))\n\t\t\t\t\t{\n\t\t\t\t\t\tpooledList.RemoveAt(num);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tusing PooledList<ItemDefinition> pooledList2 = Facepunch.Pool.Get<PooledList<ItemDefinition>>();\n\t\t\t\tint num2 = 0;\n\t\t\t\tforeach (TechTreeData.NodeInstance item in pooledList)\n\t\t\t\t{\n\t\t\t\t\tif (item != null && !(item.itemDef == null))\n\t\t\t\t\t{\n\t\t\t\t\t\tnum2 += ScrapForResearch(item.itemDef, techTreeForLevel.techTreeLevel, out var tax, this);\n\t\t\t\t\t\tnum2 += tax;\n\t\t\t\t\t\tpooledList2.Add(item.itemDef);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (amount >= num2)\n\t\t\t\t{\n\t\t\t\t\tforeach (TechTreeData.NodeInstance item2 in pooledList)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (item2.IsGroup())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach (int output in item2.outputs)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tTechTreeData.NodeInstance byID2 = techTreeForLevel.GetByID(output);\n\t\t\t\t\t\t\t\tif (byID2 != null && byID2.itemDef != null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tplayer.blueprints.Unlock(byID2.itemDef);\n\t\t\t\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, byID2.itemDef, \"techtree\", 0, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tUnityEngine.Debug.Log(\"Player unlocked group :\" + item2.groupName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tplayer.inventory.Take(null, itemid, num2);\n\t\t\t\t\tplayer.blueprints.UnlockList(pooledList2);\n\t\t\t\t\tOxide.Core.Interface.CallHook(\"OnTechTreeNodeUnlocked\", this, byID, player, pooledList2);\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (ItemDefinition item3 in pooledList2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint tax2;\n\t\t\t\t\t\t\tint num3 = ScrapForResearch(item3, techTreeForLevel.techTreeLevel, out tax2, this);\n\t\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, item3, \"techtree\", num3 + tax2, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (byID.itemDef == null || player.blueprints.HasUnlocked(byID.itemDef))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint tax3;\n\t\tint num4 = UnityEngine.Mathf.RoundToInt((float)(ScrapForResearch(byID.itemDef, techTreeForLevel.techTreeLevel, out tax3, this) + tax3) * GetBypassCostMultiplier());\n\t\tif (amount >= num4)\n\t\t{\n\t\t\tplayer.inventory.Take(null, itemid, num4);\n\t\t\tfloat techTreeFailChance = GetTechTreeFailChance();\n\t\t\tif (UnityEngine.Random.value < techTreeFailChance)\n\t\t\t{\n\t\t\t\tClientRPC(RpcTarget.Player(\"RPC_PrototypeFailed\", player));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplayer.blueprints.Unlock(byID.itemDef);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, byID.itemDef, \"techtree_prototype\", num4, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Workbench workbench, TechTreeData.NodeInstance local5, BasePlayer local0",
      "TargetName": "Workbench",
      "MethodName": "RPC_TechTreeUnlock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1612905148,
      "Name": "OnTechTreeNodeUnlocked",
      "FullName": "OnTechTreeNodeUnlocked",
      "Category": "TechTree",
      "Parameters": [
        {
          "name": "workbench",
          "typeName": "Workbench",
          "optional": false
        },
        {
          "name": "local5",
          "typeName": "TechTreeData+NodeInstance",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local12",
          "typeName": "PooledList`1[ItemDefinition]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a tech tree node is unlocked."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_TechTreeUnlock(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tint id = msg.read.Int32();\n\tint level = msg.read.Int32();\n\tbool flag = msg.read.Bit();\n\tTechTreeData techTreeForLevel = GetTechTreeForLevel(level);\n\tif (techTreeForLevel == null || player.currentCraftLevel <= (float)techTreeForLevel.techTreeLevel || player.IsInTutorial || (flag && !HasTechTreeBypassUpgrade()))\n\t{\n\t\treturn;\n\t}\n\tTechTreeData.NodeInstance byID = techTreeForLevel.GetByID(id);\n\tif (byID == null)\n\t{\n\t\tUnityEngine.Debug.Log(\"Node for unlock not found :\" + id);\n\t}\n\telse\n\t{\n\t\tif (Oxide.Core.Interface.CallHook(\"OnTechTreeNodeUnlock\", this, byID, player) != null)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint itemid = ItemManager.FindItemDefinition(\"scrap\").itemid;\n\t\tint amount = player.inventory.GetAmount(itemid);\n\t\tif (!flag)\n\t\t{\n\t\t\tusing (PooledList<TechTreeData.NodeInstance> pooledList = Facepunch.Pool.Get<PooledList<TechTreeData.NodeInstance>>())\n\t\t\t{\n\t\t\t\ttechTreeForLevel.GetNodesRequiredToUnlock(player, byID, pooledList);\n\t\t\t\tfor (int num = pooledList.Count - 1; num >= 0; num--)\n\t\t\t\t{\n\t\t\t\t\tTechTreeData.NodeInstance nodeInstance = pooledList[num];\n\t\t\t\t\tif (nodeInstance.itemDef == null || player.blueprints.HasUnlocked(nodeInstance.itemDef))\n\t\t\t\t\t{\n\t\t\t\t\t\tpooledList.RemoveAt(num);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tusing PooledList<ItemDefinition> pooledList2 = Facepunch.Pool.Get<PooledList<ItemDefinition>>();\n\t\t\t\tint num2 = 0;\n\t\t\t\tforeach (TechTreeData.NodeInstance item in pooledList)\n\t\t\t\t{\n\t\t\t\t\tif (item != null && !(item.itemDef == null))\n\t\t\t\t\t{\n\t\t\t\t\t\tnum2 += ScrapForResearch(item.itemDef, techTreeForLevel.techTreeLevel, out var tax, this);\n\t\t\t\t\t\tnum2 += tax;\n\t\t\t\t\t\tpooledList2.Add(item.itemDef);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (amount >= num2)\n\t\t\t\t{\n\t\t\t\t\tforeach (TechTreeData.NodeInstance item2 in pooledList)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (item2.IsGroup())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tforeach (int output in item2.outputs)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tTechTreeData.NodeInstance byID2 = techTreeForLevel.GetByID(output);\n\t\t\t\t\t\t\t\tif (byID2 != null && byID2.itemDef != null)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tplayer.blueprints.Unlock(byID2.itemDef);\n\t\t\t\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, byID2.itemDef, \"techtree\", 0, this);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tUnityEngine.Debug.Log(\"Player unlocked group :\" + item2.groupName);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tplayer.inventory.Take(null, itemid, num2);\n\t\t\t\t\tplayer.blueprints.UnlockList(pooledList2);\n\t\t\t\t\tOxide.Core.Interface.CallHook(\"OnTechTreeNodeUnlocked\", this, byID, player, pooledList2);\n\t\t\t\t\t{\n\t\t\t\t\t\tforeach (ItemDefinition item3 in pooledList2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint tax2;\n\t\t\t\t\t\t\tint num3 = ScrapForResearch(item3, techTreeForLevel.techTreeLevel, out tax2, this);\n\t\t\t\t\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, item3, \"techtree\", num3 + tax2, this);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (byID.itemDef == null || player.blueprints.HasUnlocked(byID.itemDef))\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tint tax3;\n\t\tint num4 = UnityEngine.Mathf.RoundToInt((float)(ScrapForResearch(byID.itemDef, techTreeForLevel.techTreeLevel, out tax3, this) + tax3) * GetBypassCostMultiplier());\n\t\tif (amount >= num4)\n\t\t{\n\t\t\tplayer.inventory.Take(null, itemid, num4);\n\t\t\tfloat techTreeFailChance = GetTechTreeFailChance();\n\t\t\tif (UnityEngine.Random.value < techTreeFailChance)\n\t\t\t{\n\t\t\t\tClientRPC(RpcTarget.Player(\"RPC_PrototypeFailed\", player));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplayer.blueprints.Unlock(byID.itemDef);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnBlueprintLearned(player, byID.itemDef, \"techtree_prototype\", num4, this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Workbench workbench, TechTreeData.NodeInstance local5, BasePlayer local0, PooledList`1[ItemDefinition] local12",
      "TargetName": "Workbench",
      "MethodName": "RPC_TechTreeUnlock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Traps": [
    {
      "Id": 1803552249,
      "Name": "OnTrapSnapped",
      "FullName": "OnTrapSnapped",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "baseTrapTrigger",
          "typeName": "BaseTrapTrigger",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a trap is snapped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "internal override void OnObjectAdded(UnityEngine.GameObject obj, UnityEngine.Collider col)\n{\n\tOxide.Core.Interface.CallHook(\"OnTrapSnapped\", this, obj, col);\n\tbase.OnObjectAdded(obj, col);\n\t_trap.ObjectEntered(obj);\n}\n",
      "ParametersText": "BaseTrapTrigger baseTrapTrigger",
      "TargetName": "BaseTrapTrigger",
      "MethodName": "OnObjectAdded",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1956545557,
      "Name": "OnTrapDisarm",
      "FullName": "OnTrapDisarm",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "landmine",
          "typeName": "Landmine",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when trap disarm occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void RPC_Disarm(BaseEntity.RPCMessage rpc)\n{\n\tif ((ulong)rpc.player.userID != triggerPlayerID && Armed() && Oxide.Core.Interface.CallHook(\"OnTrapDisarm\", this, rpc.player) == null && Triggered())\n\t{\n\t\tif (UnityEngine.Random.Range(0, 100) < 15)\n\t\t{\n\t\t\tInvoke(TryExplode, 0.05f);\n\t\t\treturn;\n\t\t}\n\t\tSetFlag(BaseEntity.Flags.On, b: false);\n\t\trpc.player.GiveItem(ItemManager.CreateByName(\"trap.landmine\", 1, 0uL), BaseEntity.GiveItemReason.PickedUp);\n\t\tKill();\n\t}\n}\n",
      "ParametersText": "Landmine landmine, BasePlayer player",
      "TargetName": "Landmine",
      "MethodName": "RPC_Disarm",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2696445224,
      "Name": "OnTrapTrigger",
      "FullName": "OnTrapTrigger [Landmine]",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "landmine",
          "typeName": "Landmine",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when trap trigger occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ObjectEntered(UnityEngine.GameObject obj)\n{\n\tif (!base.isClient)\n\t{\n\t\tif (!Armed())\n\t\t{\n\t\t\tCancelInvoke(Arm);\n\t\t\tblocked = true;\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnTrapTrigger\", this, obj) == null)\n\t\t{\n\t\t\tBasePlayer ply = UnityEngine.GameObjectEx.ToBaseEntity(obj) as BasePlayer;\n\t\t\tTrigger(ply);\n\t\t}\n\t}\n}\n",
      "ParametersText": "Landmine landmine",
      "TargetName": "Landmine",
      "MethodName": "ObjectEntered",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 770269611,
      "Name": "OnTrapArm",
      "FullName": "OnTrapArm",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "bearTrap",
          "typeName": "BearTrap",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when trap arm occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprivate void RPC_Arm(BaseEntity.RPCMessage rpc)\n{\n\tif (!Armed() && Oxide.Core.Interface.CallHook(\"OnTrapArm\", this, rpc.player) == null)\n\t{\n\t\tArm();\n\t}\n}\n",
      "ParametersText": "BearTrap bearTrap, BasePlayer player",
      "TargetName": "BearTrap",
      "MethodName": "RPC_Arm",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2696445224,
      "Name": "OnTrapTrigger",
      "FullName": "OnTrapTrigger [BearTrap]",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "bearTrap",
          "typeName": "BearTrap",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when trap trigger occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void ObjectEntered(UnityEngine.GameObject obj)\n{\n\tif (Armed() && Oxide.Core.Interface.CallHook(\"OnTrapTrigger\", this, obj) == null)\n\t{\n\t\thurtTarget = obj;\n\t\tInvoke(DelayedFire, 0.05f);\n\t}\n}\n",
      "ParametersText": "BearTrap bearTrap",
      "TargetName": "BearTrap",
      "MethodName": "ObjectEntered",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1312978703,
      "Name": "OnWildlifeTrap",
      "FullName": "OnWildlifeTrap",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "wildlifeTrap",
          "typeName": "WildlifeTrap",
          "optional": false
        },
        {
          "name": "trapped",
          "typeName": "TrappableWildlife",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when wildlife trap occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TrapWildlife(TrappableWildlife trapped)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnWildlifeTrap\", this, trapped) == null)\n\t{\n\t\tItem item = ItemManager.Create(trapped.inventoryObject, UnityEngine.Random.Range(trapped.minToCatch, trapped.maxToCatch + 1), 0uL);\n\t\tif (base.LastLootedByPlayer != null)\n\t\t{\n\t\t\titem.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.SurvivalTrap);\n\t\t}\n\t\tif (!item.MoveToContainer(base.inventory))\n\t\t{\n\t\t\titem.Remove();\n\t\t\tOnTrappedWildlife(setFlag: false);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tOnTrappedWildlife(setFlag: true);\n\t\t}\n\t}\n}\n",
      "ParametersText": "WildlifeTrap wildlifeTrap, TrappableWildlife trapped",
      "TargetName": "WildlifeTrap",
      "MethodName": "TrapWildlife",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1312978703,
      "Name": "OnWildlifeTrap",
      "FullName": "OnWildlifeTrap [SurvivalFishTrap]",
      "Category": "Traps",
      "Parameters": [
        {
          "name": "survivalFishTrap",
          "typeName": "SurvivalFishTrap",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ItemDefinition",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when wildlife trap occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void TrapThink()\n{\n\tItemDefinition itemDefinition = null;\n\tItem item = null;\n\tint usedLureAmount = 0;\n\tusing (System.Collections.Generic.List<Item>.Enumerator enumerator = base.inventory.itemList.GetEnumerator())\n\t{\n\t\tif (enumerator.MoveNext())\n\t\t{\n\t\t\tItem current = enumerator.Current;\n\t\t\tif ((current.info.TryGetComponent<ItemModCompostable>(out var component) ? component.BaitValue : 0f) > 0f)\n\t\t\t{\n\t\t\t\titem = current;\n\t\t\t\titemDefinition = FishLookup.Instance.GetFish(base.transform.position, cachedWaterBody, current, out var _, current.info.GetComponent<ItemModFishable>(), out usedLureAmount, out var _, 5f);\n\t\t\t}\n\t\t}\n\t}\n\titem?.UseItem(usedLureAmount);\n\tif (UnityEngine.Random.Range(0f, 1f) <= trapSuccessRate || !(itemDefinition != null))\n\t{\n\t\treturn;\n\t}\n\ttry\n\t{\n\t\tbypassItemFilter = true;\n\t\tif (Oxide.Core.Interface.CallHook(\"OnWildlifeTrap\", this, itemDefinition) == null)\n\t\t{\n\t\t\tItem item2 = ItemManager.Create(itemDefinition, 1, 0uL);\n\t\t\tif (base.LastLootedByPlayer != null)\n\t\t\t{\n\t\t\t\titem2.SetItemOwnership(base.LastLootedByPlayer, ItemOwnershipPhrases.SurvivalTrap);\n\t\t\t}\n\t\t\tif (!item2.MoveToContainer(base.inventory))\n\t\t\t{\n\t\t\t\titem2.Drop(base.transform.position, UnityEngine.Vector3.zero, UnityEngine.Quaternion.identity);\n\t\t\t}\n\t\t\tOnTrappedWildlife(setFlag: true);\n\t\t}\n\t}\n\tfinally\n\t{\n\t\tbypassItemFilter = false;\n\t}\n}\n",
      "ParametersText": "SurvivalFishTrap survivalFishTrap, ItemDefinition local0",
      "TargetName": "SurvivalFishTrap",
      "MethodName": "TrapThink",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Turret": [
    {
      "Id": 3691091596,
      "Name": "OnTurretTarget",
      "FullName": "OnTurretTarget",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret target occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetTarget(BaseCombatEntity targ)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnTurretTarget\", this, targ) != null)\n\t{\n\t\treturn;\n\t}\n\tif (targ != target || targ.IsRealNull() != target.IsRealNull())\n\t{\n\t\tEffect.server.Run((targ == null) ? targetLostEffect.resourcePath : targetAcquiredEffect.resourcePath, base.transform.position, UnityEngine.Vector3.up);\n\t\tif (outputs != null && outputs.Length != 0 && outputs[0].connectedTo.Get() != null)\n\t\t{\n\t\t\tMarkDirtyForceUpdateOutputs();\n\t\t}\n\t\tnextShotTime += 0.10000000149011612;\n\t\tauthDirty = true;\n\t}\n\ttarget = targ;\n\tif (target.IsRealNull())\n\t{\n\t\ttargetVisible = false;\n\t\tnextVisCheck = 0.0;\n\t}\n\telse\n\t{\n\t\tlastTargetSeenTime = UnityEngine.Time.realtimeSinceStartupAsDouble;\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "SetTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3717999484,
      "Name": "OnTurretStartup",
      "FullName": "OnTurretStartup",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret startup occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void InitiateStartup()\n{\n\tif (!IsOnline() && !booting && Oxide.Core.Interface.CallHook(\"OnTurretStartup\", this) == null)\n\t{\n\t\tEffect.server.Run(onlineSound.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tInvoke(SetOnline, 2f);\n\t\tbooting = true;\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "InitiateStartup",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1020909229,
      "Name": "OnTurretShutdown",
      "FullName": "OnTurretShutdown",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret shutdown occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void InitiateShutdown()\n{\n\tif ((!IsOffline() || booting) && Oxide.Core.Interface.CallHook(\"OnTurretShutdown\", this) == null)\n\t{\n\t\tCancelInvoke(SetOnline);\n\t\tbooting = false;\n\t\tEffect.server.Run(offlineSound.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\tSetIsOnline(online: false);\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "InitiateShutdown",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 168477335,
      "Name": "OnTurretToggle",
      "FullName": "OnTurretToggle",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a turret toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetIsOnline(bool online)\n{\n\tBaseProjectile attachedWeapon = GetAttachedWeapon();\n\tif ((bool)attachedWeapon && attachedWeapon is ITurretNotify turretNotify)\n\t{\n\t\tturretNotify.OnAddedRemovedToTurret(online);\n\t}\n\tif (online != IsOn() && Oxide.Core.Interface.CallHook(\"OnTurretToggle\", this) == null)\n\t{\n\t\tSetFlag(BaseEntity.Flags.On, online);\n\t\tOnTurretPowerChanged(online);\n\t\tbooting = false;\n\t\tBaseProjectile attachedWeapon2 = GetAttachedWeapon();\n\t\tif ((bool)attachedWeapon2)\n\t\t{\n\t\t\tattachedWeapon2.SetLightsOn(online);\n\t\t}\n\t\tSendNetworkUpdate();\n\t\tif (IsOffline())\n\t\t{\n\t\t\tSetTarget(null);\n\t\t\tisLootable = true;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tisLootable = false;\n\t\t\tauthDirty = true;\n\t\t}\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "SetIsOnline",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3383609399,
      "Name": "OnTurretDeauthorize",
      "FullName": "OnTurretDeauthorize",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret deauthorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void RemoveSelfAuthorize(BaseEntity.RPCMessage rpc)\n{\n\tif (!booting && !IsOnline() && IsAuthed(rpc.player) && Oxide.Core.Interface.CallHook(\"OnTurretDeauthorize\", this, rpc.player) == null)\n\t{\n\t\tauthorizedPlayers.Remove(rpc.player.userID);\n\t\tauthDirty = true;\n\t\tFacepunch.Rust.Analytics.Azure.OnEntityAuthChanged(this, rpc.player, authorizedPlayers, \"removed\", rpc.player.userID);\n\t\tUpdateMaxAuthCapacity();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "RemoveSelfAuthorize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3764210145,
      "Name": "OnTurretClearList",
      "FullName": "OnTurretClearList",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret clear list occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void ClearList(BaseEntity.RPCMessage rpc)\n{\n\tBasePlayer player = rpc.player;\n\tif (!(player == null) && !booting && !IsOnline() && player.CanBuild() && Oxide.Core.Interface.CallHook(\"OnTurretClearList\", this, rpc.player) == null)\n\t{\n\t\tauthorizedPlayers.Clear();\n\t\tauthDirty = true;\n\t\tFacepunch.Rust.Analytics.Azure.OnEntityAuthChanged(this, rpc.player, authorizedPlayers, \"clear\", rpc.player.userID);\n\t\tUpdateMaxAuthCapacity();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "ClearList",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 273264000,
      "Name": "OnTurretModeToggle",
      "FullName": "OnTurretModeToggle [Peacekeeper]",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a turret mode toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void SERVER_Peacekeeper(BaseEntity.RPCMessage rpc)\n{\n\tif (IsAuthed(rpc.player) && Oxide.Core.Interface.CallHook(\"OnTurretModeToggle\", this, rpc.player) == null)\n\t{\n\t\tSetPeacekeepermode(isOn: true);\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "SERVER_Peacekeeper",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1562791322,
      "Name": "OnTurretRotate",
      "FullName": "OnTurretRotate",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a turret is rotated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void FlipAim(BaseEntity.RPCMessage rpc)\n{\n\tif (!IsOnline() && IsAuthed(rpc.player) && !booting && Oxide.Core.Interface.CallHook(\"OnTurretRotate\", this, rpc.player) == null)\n\t{\n\t\tbase.transform.rotation = UnityEngine.Quaternion.LookRotation(-base.transform.forward, base.transform.up);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "FlipAim",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1791975019,
      "Name": "OnTurretAuthorize",
      "FullName": "OnTurretAuthorize",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret authorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\nprivate void AddSelfAuthorize(BaseEntity.RPCMessage rpc)\n{\n\tAddSelfAuthorize(rpc.player);\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "AddSelfAuthorize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 554719856,
      "Name": "OnTurretAssign",
      "FullName": "OnTurretAssign",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret assign occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void AssignToFriend(BaseEntity.RPCMessage msg)\n{\n\tif (!AtMaxAuthCapacity() && !(msg.player == null) && msg.player.CanInteract() && CanChangeSettings(msg.player))\n\t{\n\t\tulong num = msg.read.UInt64();\n\t\tif (num != 0L && !IsAuthed(num) && Oxide.Core.Interface.CallHook(\"OnTurretAssign\", this, num, msg.player) == null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnEntityAuthChanged(this, msg.player, authorizedPlayers, \"added\", num);\n\t\t\tauthorizedPlayers.Add(num);\n\t\t\tUpdateMaxAuthCapacity();\n\t\t\tSendNetworkUpdate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnTurretAssigned\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, ulong local0, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "AssignToFriend",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 498675742,
      "Name": "OnTurretAssigned",
      "FullName": "OnTurretAssigned",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "System.UInt64",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a turret is assigned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\npublic void AssignToFriend(BaseEntity.RPCMessage msg)\n{\n\tif (!AtMaxAuthCapacity() && !(msg.player == null) && msg.player.CanInteract() && CanChangeSettings(msg.player))\n\t{\n\t\tulong num = msg.read.UInt64();\n\t\tif (num != 0L && !IsAuthed(num) && Oxide.Core.Interface.CallHook(\"OnTurretAssign\", this, num, msg.player) == null)\n\t\t{\n\t\t\tFacepunch.Rust.Analytics.Azure.OnEntityAuthChanged(this, msg.player, authorizedPlayers, \"added\", num);\n\t\t\tauthorizedPlayers.Add(num);\n\t\t\tUpdateMaxAuthCapacity();\n\t\t\tSendNetworkUpdate();\n\t\t\tOxide.Core.Interface.CallHook(\"OnTurretAssigned\", this, num, msg.player);\n\t\t}\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, ulong local0, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "AssignToFriend",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2075584415,
      "Name": "OnInterferenceUpdate",
      "FullName": "OnInterferenceUpdate",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an inteRFerence is updated."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool RecalculateInterference()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnInterferenceUpdate\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tbool flag = HasInterference();\n\tif (ShouldTurretOverload(out var _))\n\t{\n\t\tSetInterferenceEnabled(state: true);\n\t\treturn flag != HasInterference();\n\t}\n\tSetInterferenceEnabled(state: false);\n\tforeach (AutoTurret nearbyTurret in nearbyTurrets)\n\t{\n\t\tif (nearbyTurret.IsOn() && !nearbyTurret.HasInterference())\n\t\t{\n\t\t\tnearbyTurret.interferringTurrets.Add(this);\n\t\t\tinterferringTurrets.Add(nearbyTurret);\n\t\t}\n\t}\n\treturn flag != HasInterference();\n}\n",
      "ParametersText": "AutoTurret autoTurret",
      "TargetName": "AutoTurret",
      "MethodName": "RecalculateInterference",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 273264000,
      "Name": "OnTurretModeToggle",
      "FullName": "OnTurretModeToggle [AttackAll]",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a turret mode toggles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server]\nprivate void SERVER_AttackAll(BaseEntity.RPCMessage rpc)\n{\n\tif (IsAuthed(rpc.player) && Oxide.Core.Interface.CallHook(\"OnTurretModeToggle\", this, rpc.player) == null)\n\t{\n\t\tSetPeacekeepermode(isOn: false);\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player",
      "TargetName": "AutoTurret",
      "MethodName": "SERVER_AttackAll",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 931035950,
      "Name": "OnTurretIdentifierSet",
      "FullName": "OnTurretIdentifierSet",
      "Category": "Turret",
      "Parameters": [
        {
          "name": "autoTurret",
          "typeName": "AutoTurret",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "newID",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when turret identifier set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetID(BasePlayer player, string oldID, string newID, bool bypassChecks = false)\n{\n\tif ((CanChangeID(player) || bypassChecks) && (string.IsNullOrEmpty(oldID) || ComputerStation.IsValidIdentifier(oldID)) && ComputerStation.IsValidIdentifier(newID) && oldID == GetIdentifier() && Oxide.Core.Interface.CallHook(\"OnTurretIdentifierSet\", this, player, newID) == null)\n\t{\n\t\tUnityEngine.Debug.Log(\"SetID success!\");\n\t\tUpdateIdentifier(newID);\n\t}\n}\n",
      "ParametersText": "AutoTurret autoTurret, BasePlayer player, string newID",
      "TargetName": "AutoTurret",
      "MethodName": "SetID",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 165462314,
      "Name": "OnNearbyTurretsScan",
      "FullName": "OnNearbyTurretsScan",
      "Category": "Turret",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when nearby turrets scan occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void AddNearbyTurrets()\n{\n\tnearbyTurrets.Clear();\n\tSystem.Collections.Generic.List<AutoTurret> obj = Facepunch.Pool.Get<System.Collections.Generic.List<AutoTurret>>();\n\tif (Oxide.Core.Interface.CallHook(\"OnNearbyTurretsScan\", this, obj) == null)\n\t{\n\t\tVis.Entities(base.transform.position, ConVar.Sentry.interferenceradius, obj, 256, UnityEngine.QueryTriggerInteraction.Ignore);\n\t}\n\tforeach (AutoTurret item in obj)\n\t{\n\t\tif (item.IsServer && !(item == this) && !item.IsDestroyed)\n\t\t{\n\t\t\titem.nearbyTurrets.Add(this);\n\t\t\tnearbyTurrets.Add(item);\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n}\n",
      "ParametersText": "",
      "TargetName": "AutoTurret",
      "MethodName": "AddNearbyTurrets",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Vehicle": [
    {
      "Id": 1860966052,
      "Name": "OnHelicopterTarget",
      "FullName": "OnHelicopterTarget",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "helicopterTurret",
          "typeName": "HelicopterTurret",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when helicopter target occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetTarget(BaseCombatEntity newTarget)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHelicopterTarget\", this, newTarget) == null)\n\t{\n\t\t_target = newTarget;\n\t\tUpdateTargetVisibility();\n\t}\n}\n",
      "ParametersText": "HelicopterTurret helicopterTurret",
      "TargetName": "HelicopterTurret",
      "MethodName": "SetTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3168805415,
      "Name": "CanHelicopterStrafeTarget",
      "FullName": "CanHelicopterStrafeTarget",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to helicopter strafe target.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool ValidRocketTarget(BasePlayer ply)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanHelicopterStrafeTarget\", this, ply);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (ply == null)\n\t{\n\t\treturn false;\n\t}\n\treturn !ply.IsNearEnemyBase();\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "ValidRocketTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 723973224,
      "Name": "CanHelicopterUseNapalm",
      "FullName": "CanHelicopterUseNapalm",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to helicopter use napalm.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanUseNapalm()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanHelicopterUseNapalm\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn UnityEngine.Time.realtimeSinceStartup - lastNapalmTime >= UnityEngine.Random.Range(25f, 35f);\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "CanUseNapalm",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2429188336,
      "Name": "CanHelicopterStrafe",
      "FullName": "CanHelicopterStrafe",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to helicopter strafe.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanStrafe()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanHelicopterStrafe\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (UnityEngine.Time.realtimeSinceStartup - lastStrafeTime >= UnityEngine.Random.Range(15f, 25f))\n\t{\n\t\treturn CanInterruptState();\n\t}\n\treturn false;\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "CanStrafe",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 4194276424,
      "Name": "CanHelicopterTarget",
      "FullName": "CanHelicopterTarget",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        },
        {
          "name": "ply",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to helicopter target.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool PlayerVisible(BasePlayer ply)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanHelicopterTarget\", this, ply);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tusing (TimeWarning.New(\"PatrolHelicoperAI.PlayerVisible\"))\n\t{\n\t\tUnityEngine.Vector3 position = ply.eyes.position;\n\t\tif (ply.eyes.position.y < WaterSystem.OceanLevel && UnityEngine.Mathf.Abs(WaterSystem.OceanLevel - ply.eyes.position.y) > oceanDepthTargetCutoff)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tif (TOD_Sky.Instance.IsNight && UnityEngine.Vector3.Distance(position, interestZoneOrigin) > 40f)\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\tUnityEngine.Vector3 vector = base.transform.position - UnityEngine.Vector3.up * 6f;\n\t\tfloat num = UnityEngine.Vector3.Distance(position, vector);\n\t\tUnityEngine.Vector3 normalized = (position - vector).normalized;\n\t\tif (GamePhysics.Trace(new UnityEngine.Ray(vector + normalized * 5f, normalized), 0f, out var hitInfo, num * 1.1f, 1218652417) && UnityEngine.GameObjectEx.ToBaseEntity(hitInfo.collider.gameObject) == ply)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI, BasePlayer ply",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "PlayerVisible",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3034825182,
      "Name": "OnHelicopterStrafeEnter",
      "FullName": "OnHelicopterStrafeEnter",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        },
        {
          "name": "position",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "strafeTarget",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a helicopter strafe enters."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private void StartStrafe(BasePlayer strafeTarget, bool shouldUseNapalm = false)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHelicopterStrafeEnter\", this, strafeTarget.transform.position, strafeTarget) == null)\n\t{\n\t\tstrafe_target = strafeTarget;\n\t\tget_out_of_strafe_distance = UnityEngine.Random.Range(13f, 17f);\n\t\tif (CanUseNapalm() && shouldUseNapalm)\n\t\t{\n\t\t\tpassNapalm = shouldUseNapalm;\n\t\t\tuseNapalm = true;\n\t\t\tlastNapalmTime = UnityEngine.Time.realtimeSinceStartup;\n\t\t}\n\t\tlastStrafeTime = UnityEngine.Time.realtimeSinceStartup;\n\t\t_currentState = PatrolHelicopterAI.aiState.STRAFE;\n\t\tRefreshTargetPosition();\n\t\tnumRocketsLeft = 12 + UnityEngine.Random.Range(-1, 1);\n\t\tlastRocketTime = 0f;\n\t\tmovementLockingAiming = true;\n\t\tUnityEngine.Vector3 randomOffset = GetRandomOffset(strafe_target_position, 175f, 192.5f);\n\t\tSetTargetDestination(randomOffset, 10f);\n\t\tSetIdealRotation(GetYawRotationTo(randomOffset));\n\t\tputtingDistance = true;\n\t}\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI, UnityEngine.Vector3 position, BasePlayer strafeTarget",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "StartStrafe",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 811131292,
      "Name": "OnHelicopterRetire",
      "FullName": "OnHelicopterRetire",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "patrolHelicopterAI",
          "typeName": "PatrolHelicopterAI",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when helicopter retire occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Retire()\n{\n\tif (!isRetiring && Oxide.Core.Interface.CallHook(\"OnHelicopterRetire\", this) == null)\n\t{\n\t\tInvoke(DestroyMe, 240f);\n\t\tfloat x = TerrainMeta.Size.x;\n\t\tfloat y = 200f;\n\t\tUnityEngine.Vector3 newPos = UnityEngine.Vector3Ex.Range(-1f, 1f);\n\t\tnewPos.y = 0f;\n\t\tnewPos.Normalize();\n\t\tnewPos *= x * 20f;\n\t\tnewPos.y = y;\n\t\tExitCurrentState();\n\t\tisRetiring = true;\n\t\tState_Move_Enter(newPos);\n\t}\n}\n",
      "ParametersText": "PatrolHelicopterAI patrolHelicopterAI",
      "TargetName": "PatrolHelicopterAI",
      "MethodName": "Retire",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3161252930,
      "Name": "CanBradleyApcTarget",
      "FullName": "CanBradleyApcTarget",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to bradley apc target.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool VisibilityTest(BaseEntity ent)\n{\n\tif (ent == null)\n\t{\n\t\treturn false;\n\t}\n\tif (!(UnityEngine.Vector3.Distance(ent.transform.position, base.transform.position) < viewDistance))\n\t{\n\t\treturn false;\n\t}\n\tbool flag = false;\n\tif (ent is BasePlayer)\n\t{\n\t\tBasePlayer basePlayer = ent as BasePlayer;\n\t\tUnityEngine.Vector3 position = mainTurret.transform.position;\n\t\tflag = IsVisible(basePlayer.eyes.position, position) || IsVisible(basePlayer.transform.position + UnityEngine.Vector3.up * 0.1f, position);\n\t\tif (!flag && basePlayer.isMounted && basePlayer.GetMounted().VehicleParent() != null && basePlayer.GetMounted().VehicleParent().AlwaysAllowBradleyTargeting)\n\t\t{\n\t\t\tflag = IsVisible(basePlayer.GetMounted().VehicleParent().bounds.center, position);\n\t\t}\n\t\tif (flag)\n\t\t{\n\t\t\tflag = !UnityEngine.Physics.SphereCast(new UnityEngine.Ray(position, UnityEngine.Vector3Ex.Direction(basePlayer.eyes.position, position)), 0.05f, UnityEngine.Vector3.Distance(basePlayer.eyes.position, position), 10551297);\n\t\t}\n\t}\n\telse\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Standard vis test!\");\n\t\tflag = IsVisible(ent.CenterPoint());\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBradleyApcTarget\", this, ent);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn flag;\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "VisibilityTest",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 99036976,
      "Name": "OnBradleyApcInitialize",
      "FullName": "OnBradleyApcInitialize",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a bradley apc initializes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Initialize()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnBradleyApcInitialize\", this) == null)\n\t{\n\t\tmyRigidBody.centerOfMass = centerOfMass.localPosition;\n\t\tdestination = base.transform.position;\n\t\tfinalDestination = base.transform.position;\n\t}\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "Initialize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2285395818,
      "Name": "OnBradleyApcHunt",
      "FullName": "OnBradleyApcHunt",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bradley apc hunt occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateMovement_Hunt()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnBradleyApcHunt\", this) != null || patrolPath == null)\n\t{\n\t\treturn;\n\t}\n\tBradleyAPC.TargetInfo targetInfo = targetList[0];\n\tif (!targetInfo.IsValid())\n\t{\n\t\treturn;\n\t}\n\tif (HasPath() && targetInfo.IsVisible())\n\t{\n\t\tif (currentPath.Count > 1)\n\t\t{\n\t\t\tUnityEngine.Vector3 item = currentPath[currentPathIndex];\n\t\t\tClearPath();\n\t\t\tcurrentPath.Add(item);\n\t\t\tfinalDestination = item;\n\t\t\tcurrentPathIndex = 0;\n\t\t}\n\t}\n\telse\n\t{\n\t\tif (!(UnityEngine.Time.time > nextEngagementPathTime) || HasPath() || targetInfo.IsVisible())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tbool flag = false;\n\t\tIAIPathNode start = patrolPath.GetClosestToPoint(base.transform.position);\n\t\tSystem.Collections.Generic.List<IAIPathNode> nodes = Facepunch.Pool.Get<System.Collections.Generic.List<IAIPathNode>>();\n\t\tif (GetEngagementPath(ref nodes))\n\t\t{\n\t\t\tflag = true;\n\t\t\tstart = nodes[nodes.Count - 1];\n\t\t}\n\t\tIAIPathNode iAIPathNode = null;\n\t\tSystem.Collections.Generic.List<IAIPathNode> nearNodes = Facepunch.Pool.Get<System.Collections.Generic.List<IAIPathNode>>();\n\t\tpatrolPath.GetNodesNear(targetInfo.lastSeenPosition, ref nearNodes, 30f);\n\t\tSystem.Collections.Generic.Stack<IAIPathNode> stack = null;\n\t\tfloat num = float.PositiveInfinity;\n\t\tfloat y = mainTurretEyePos.localPosition.y;\n\t\tforeach (IAIPathNode item2 in nearNodes)\n\t\t{\n\t\t\tSystem.Collections.Generic.Stack<IAIPathNode> path = new System.Collections.Generic.Stack<IAIPathNode>();\n\t\t\tif (targetInfo.entity.IsVisible(item2.Position + new UnityEngine.Vector3(0f, y, 0f)) && Rust.Ai.AStarPath.FindPath(start, item2, out path, out var pathCost) && pathCost < num)\n\t\t\t{\n\t\t\t\tstack = path;\n\t\t\t\tnum = pathCost;\n\t\t\t\tiAIPathNode = item2;\n\t\t\t}\n\t\t}\n\t\tif (stack == null && nearNodes.Count > 0)\n\t\t{\n\t\t\tSystem.Collections.Generic.Stack<IAIPathNode> path2 = new System.Collections.Generic.Stack<IAIPathNode>();\n\t\t\tIAIPathNode iAIPathNode2 = nearNodes[UnityEngine.Random.Range(0, nearNodes.Count)];\n\t\t\tif (Rust.Ai.AStarPath.FindPath(start, iAIPathNode2, out path2, out var pathCost2) && pathCost2 < num)\n\t\t\t{\n\t\t\t\tstack = path2;\n\t\t\t\tiAIPathNode = iAIPathNode2;\n\t\t\t}\n\t\t}\n\t\tif (stack != null)\n\t\t{\n\t\t\tcurrentPath.Clear();\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < nodes.Count - 1; i++)\n\t\t\t\t{\n\t\t\t\t\tcurrentPath.Add(nodes[i].Position);\n\t\t\t\t}\n\t\t\t}\n\t\t\tforeach (IAIPathNode item3 in stack)\n\t\t\t{\n\t\t\t\tcurrentPath.Add(item3.Position);\n\t\t\t}\n\t\t\tcurrentPathIndex = -1;\n\t\t\tpathLooping = false;\n\t\t\tfinalDestination = iAIPathNode.Position;\n\t\t}\n\t\tFacepunch.Pool.FreeUnmanaged(ref nearNodes);\n\t\tFacepunch.Pool.FreeUnmanaged(ref nodes);\n\t\tnextEngagementPathTime = UnityEngine.Time.time + 5f;\n\t}\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "UpdateMovement_Hunt",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3800225696,
      "Name": "OnBradleyApcPatrol",
      "FullName": "OnBradleyApcPatrol",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bradley apc patrol occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UpdateMovement_Patrol()\n{\n\tif (patrolPath == null || UnityEngine.Time.time < nextPatrolTime)\n\t{\n\t\treturn;\n\t}\n\tnextPatrolTime = UnityEngine.Time.time + 20f;\n\tif ((HasPath() && !IsAtFinalDestination()) || Oxide.Core.Interface.CallHook(\"OnBradleyApcPatrol\", this) != null)\n\t{\n\t\treturn;\n\t}\n\tIAIPathInterestNode randomInterestNodeAwayFrom = patrolPath.GetRandomInterestNodeAwayFrom(base.transform.position);\n\tIAIPathNode closestToPoint = patrolPath.GetClosestToPoint(randomInterestNodeAwayFrom.Position);\n\tbool flag = false;\n\tSystem.Collections.Generic.List<IAIPathNode> nodes = Facepunch.Pool.Get<System.Collections.Generic.List<IAIPathNode>>();\n\tIAIPathNode iAIPathNode;\n\tif (GetEngagementPath(ref nodes))\n\t{\n\t\tflag = true;\n\t\tiAIPathNode = nodes[nodes.Count - 1];\n\t}\n\telse\n\t{\n\t\tiAIPathNode = patrolPath.GetClosestToPoint(base.transform.position);\n\t}\n\tif (UnityEngine.Vector3.Distance(finalDestination, closestToPoint.Position) > 2f)\n\t{\n\t\tSystem.Collections.Generic.Stack<IAIPathNode> path;\n\t\tfloat pathCost;\n\t\tif (closestToPoint == iAIPathNode)\n\t\t{\n\t\t\tcurrentPath.Clear();\n\t\t\tcurrentPath.Add(closestToPoint.Position);\n\t\t\tcurrentPathIndex = -1;\n\t\t\tpathLooping = false;\n\t\t\tfinalDestination = closestToPoint.Position;\n\t\t}\n\t\telse if (Rust.Ai.AStarPath.FindPath(iAIPathNode, closestToPoint, out path, out pathCost))\n\t\t{\n\t\t\tcurrentPath.Clear();\n\t\t\tif (flag)\n\t\t\t{\n\t\t\t\tfor (int i = 0; i < nodes.Count - 1; i++)\n\t\t\t\t{\n\t\t\t\t\tcurrentPath.Add(nodes[i].Position);\n\t\t\t\t}\n\t\t\t}\n\t\t\tforeach (IAIPathNode item in path)\n\t\t\t{\n\t\t\t\tcurrentPath.Add(item.Position);\n\t\t\t}\n\t\t\tcurrentPathIndex = -1;\n\t\t\tpathLooping = false;\n\t\t\tfinalDestination = closestToPoint.Position;\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref nodes);\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "UpdateMovement_Patrol",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1814075788,
      "Name": "OnBradleyApcThink",
      "FullName": "OnBradleyApcThink",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "bradleyAPC",
          "typeName": "BradleyAPC",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when bradley apc think occurs.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoSimpleAI()\n{\n\tif (base.isClient)\n\t{\n\t\treturn;\n\t}\n\tSetFlag(BaseEntity.Flags.Reserved5, TOD_Sky.Instance.IsNight);\n\tif (Oxide.Core.Interface.CallHook(\"OnBradleyApcThink\", this) != null || !DoAI)\n\t{\n\t\treturn;\n\t}\n\tSetTarget();\n\tif (mountingScientists || inDeployedState)\n\t{\n\t\tClearPath();\n\t}\n\telse if (!IsOnSpline())\n\t{\n\t\tif (targetList.Count > 0)\n\t\t{\n\t\t\tUpdateMovement_Hunt();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tUpdateMovement_Patrol();\n\t\t}\n\t}\n\tif (!IsOnSpline())\n\t{\n\t\tAdvancePathMovement(force: false);\n\t\tfloat num = UnityEngine.Vector3.Distance(base.transform.position, destination);\n\t\tfloat value = UnityEngine.Vector3.Distance(base.transform.position, finalDestination);\n\t\tif (num > stoppingDist)\n\t\t{\n\t\t\tUnityEngine.Vector3 lhs = Direction2D(destination, base.transform.position);\n\t\t\tfloat num2 = UnityEngine.Vector3.Dot(lhs, base.transform.right);\n\t\t\tfloat num3 = UnityEngine.Vector3.Dot(lhs, base.transform.right);\n\t\t\tfloat num4 = UnityEngine.Vector3.Dot(lhs, -base.transform.right);\n\t\t\tif (UnityEngine.Vector3.Dot(lhs, -base.transform.forward) > num2)\n\t\t\t{\n\t\t\t\tif (num3 >= num4)\n\t\t\t\t{\n\t\t\t\t\tturning = 1f;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tturning = -1f;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tturning = UnityEngine.Mathf.Clamp(num2 * 3f, -1f, 1f);\n\t\t\t}\n\t\t\tfloat throttleScaleFromTurn = 1f - UnityEngine.Mathf.InverseLerp(0f, 0.3f, UnityEngine.Mathf.Abs(turning));\n\t\t\tAvoidObstacles(ref throttleScaleFromTurn);\n\t\t\tfloat num5 = UnityEngine.Vector3.Dot(myRigidBody.velocity, base.transform.forward);\n\t\t\tif (!(throttle > 0f) || !(num5 < 0.5f))\n\t\t\t{\n\t\t\t\ttimeSinceSeemingStuck = 0f;\n\t\t\t}\n\t\t\telse if ((float)timeSinceSeemingStuck > 10f)\n\t\t\t{\n\t\t\t\ttimeSinceStuckReverseStart = 0f;\n\t\t\t\ttimeSinceSeemingStuck = 0f;\n\t\t\t}\n\t\t\tfloat num6 = UnityEngine.Mathf.InverseLerp(0.1f, 0.4f, UnityEngine.Vector3.Dot(base.transform.forward, UnityEngine.Vector3.up));\n\t\t\tif ((float)timeSinceStuckReverseStart < 3f)\n\t\t\t{\n\t\t\t\tthrottle = -0.75f;\n\t\t\t\tturning = 1f;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrottle = (0.1f + UnityEngine.Mathf.InverseLerp(0f, 20f, value) * 1f) * throttleScaleFromTurn + num6;\n\t\t\t}\n\t\t}\n\t}\n\tDoWeaponAiming();\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BradleyAPC bradleyAPC",
      "TargetName": "BradleyAPC",
      "MethodName": "DoSimpleAI",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 769742881,
      "Name": "CanHelicopterDropCrate",
      "FullName": "CanHelicopterDropCrate",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to helicopter drop crate.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanDropCrate()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanHelicopterDropCrate\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn numCrates > 0;\n}\n",
      "ParametersText": "CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "CanDropCrate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3195210523,
      "Name": "OnHelicopterDropCrate",
      "FullName": "OnHelicopterDropCrate",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when helicopter drop crate occurs.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[ServerVar(Help = \"(Generated) Commands all active CH47 Chinook helicopter AI controllers to drop their cargo crate immediately\")]\npublic static void dropCrate()\n{\n\tCH47HelicopterAIController[] array = UnityEngine.Object.FindObjectsByType<CH47HelicopterAIController>(UnityEngine.FindObjectsInactive.Exclude, UnityEngine.FindObjectsSortMode.None);\n\tforeach (CH47HelicopterAIController cH47HelicopterAIController in array)\n\t{\n\t\tif (cH47HelicopterAIController.isServer)\n\t\t{\n\t\t\tcH47HelicopterAIController.DropCrate();\n\t\t}\n\t}\n}\n",
      "ParametersText": "CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "DropCrate",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1821059999,
      "Name": "OnHelicopterAttack",
      "FullName": "OnHelicopterAttack",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a helicopter attacks."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void OnAttacked(HitInfo info)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHelicopterAttack\", this, info) == null)\n\t{\n\t\tbase.OnAttacked(info);\n\t\tInitiateAnger();\n\t\tSetFlag(BaseEntity.Flags.Reserved9, base.healthFraction <= 0.8f);\n\t\tSetFlag(BaseEntity.Flags.OnFire, base.healthFraction <= 0.33f);\n\t}\n}\n",
      "ParametersText": "CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "OnAttacked",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 306073545,
      "Name": "OnHelicopterOutOfCrates",
      "FullName": "OnHelicopterOutOfCrates",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when helicopter out of crates occurs.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool OutOfCrates()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnHelicopterOutOfCrates\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn numCrates <= 0;\n}\n",
      "ParametersText": "CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "OutOfCrates",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 394568533,
      "Name": "OnHelicopterDropDoorOpen",
      "FullName": "OnHelicopterDropDoorOpen",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a helicopter drop door is opened."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetDropDoorOpen(bool open)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnHelicopterDropDoorOpen\", this) == null)\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved8, open);\n\t}\n}\n",
      "ParametersText": "CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "SetDropDoorOpen",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1650330867,
      "Name": "CanUseHelicopter",
      "FullName": "CanUseHelicopter",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "cH47HelicopterAIController",
          "typeName": "CH47HelicopterAIController",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to use helicopter.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void AttemptMount(BasePlayer player, bool doMountChecks = true)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanUseHelicopter\", player, this) == null)\n\t{\n\t\tbase.AttemptMount(player, doMountChecks);\n\t}\n}\n",
      "ParametersText": "BasePlayer player, CH47HelicopterAIController cH47HelicopterAIController",
      "TargetName": "CH47HelicopterAIController",
      "MethodName": "AttemptMount",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1313592344,
      "Name": "OnBoatPathGenerate",
      "FullName": "OnBoatPathGenerate",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a boat path is generated.",
        "Use this to scale timing based on context, player state, or location."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public static System.Collections.Generic.List<UnityEngine.Vector3> GenerateOceanPatrolPath(float minDistanceFromShore = 50f, float minWaterDepth = 8f)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnBoatPathGenerate\");\n\tif (obj is System.Collections.Generic.List<UnityEngine.Vector3>)\n\t{\n\t\treturn (System.Collections.Generic.List<UnityEngine.Vector3>)obj;\n\t}\n\tfloat x = TerrainMeta.Size.x;\n\tfloat num = x * 2f * System.MathF.PI;\n\tfloat num2 = 30f;\n\tint num3 = UnityEngine.Mathf.CeilToInt(num / num2);\n\tSystem.Collections.Generic.List<UnityEngine.Vector3> list = new System.Collections.Generic.List<UnityEngine.Vector3>();\n\tfloat num4 = x;\n\tfloat y = 0f;\n\tfor (int i = 0; i < num3; i++)\n\t{\n\t\tfloat num5 = (float)i / (float)num3 * 360f;\n\t\tlist.Add(new UnityEngine.Vector3(UnityEngine.Mathf.Sin(num5 * (System.MathF.PI / 180f)) * num4, y, UnityEngine.Mathf.Cos(num5 * (System.MathF.PI / 180f)) * num4));\n\t}\n\tfloat num6 = 4f;\n\tfloat num7 = 200f;\n\tbool flag = true;\n\tfor (int j = 0; j < ConVar.AI.ocean_patrol_path_iterations && flag; j++)\n\t{\n\t\tflag = false;\n\t\tfor (int k = 0; k < num3; k++)\n\t\t{\n\t\t\tUnityEngine.Vector3 vector = list[k];\n\t\t\tint index = ((k == 0) ? (num3 - 1) : (k - 1));\n\t\t\tint index2 = ((k != num3 - 1) ? (k + 1) : 0);\n\t\t\tUnityEngine.Vector3 b = list[index2];\n\t\t\tUnityEngine.Vector3 b2 = list[index];\n\t\t\tUnityEngine.Vector3 origin = vector;\n\t\t\tUnityEngine.Vector3 normalized = (UnityEngine.Vector3.zero - vector).normalized;\n\t\t\tUnityEngine.Vector3 vector2 = vector + normalized * num6;\n\t\t\tif (UnityEngine.Vector3.Distance(vector2, b) > num7 || UnityEngine.Vector3.Distance(vector2, b2) > num7)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbool flag2 = true;\n\t\t\tint num8 = 16;\n\t\t\tfor (int l = 0; l < num8; l++)\n\t\t\t{\n\t\t\t\tfloat num9 = (float)l / (float)num8 * 360f;\n\t\t\t\tUnityEngine.Vector3 normalized2 = new UnityEngine.Vector3(UnityEngine.Mathf.Sin(num9 * (System.MathF.PI / 180f)), y, UnityEngine.Mathf.Cos(num9 * (System.MathF.PI / 180f))).normalized;\n\t\t\t\tUnityEngine.Vector3 vector3 = vector2 + normalized2 * 1f;\n\t\t\t\tUnityEngine.Vector3 direction = normalized;\n\t\t\t\tif (vector3 != UnityEngine.Vector3.zero)\n\t\t\t\t{\n\t\t\t\t\tdirection = (vector3 - vector2).normalized;\n\t\t\t\t}\n\t\t\t\tif (!UnityEngine.Physics.SphereCast(origin, 3f, direction, out var hitInfo, minDistanceFromShore, 1084293377))\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tUnityEngine.Collider collider = hitInfo.collider;\n\t\t\t\tif (collider != null && !UnityEngine.ColliderEx.IsOnLayer(collider, Rust.Layer.Terrain))\n\t\t\t\t{\n\t\t\t\t\tMonumentInfo monument = UnityEngine.ColliderEx.GetMonument(collider);\n\t\t\t\t\tif (monument != null && monument.IsOilRig())\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tflag2 = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (flag2)\n\t\t\t{\n\t\t\t\tflag = true;\n\t\t\t\tlist[k] = vector2;\n\t\t\t}\n\t\t}\n\t}\n\tif (flag)\n\t{\n\t\tUnityEngine.Debug.LogWarning(\"Failed to generate ocean patrol path\");\n\t\treturn null;\n\t}\n\tSystem.Collections.Generic.List<int> list2 = new System.Collections.Generic.List<int>();\n\tUnityEngine.LineUtility.Simplify(list, 5f, list2);\n\tSystem.Collections.Generic.List<UnityEngine.Vector3> list3 = list;\n\tlist = new System.Collections.Generic.List<UnityEngine.Vector3>();\n\tforeach (int item in list2)\n\t{\n\t\tlist.Add(list3[item]);\n\t}\n\tUnityEngine.Debug.Log(\"Generated ocean patrol path with node count: \" + list.Count);\n\treturn list;\n}\n",
      "ParametersText": "",
      "TargetName": "BaseBoat",
      "MethodName": "GenerateOceanPatrolPath",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "System.Collections.Generic.List`1[[UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]"
    },
    {
      "Id": 3267353792,
      "Name": "OnVehiclePush",
      "FullName": "OnVehiclePush",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "baseVehicle",
          "typeName": "BaseVehicle",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when vehicle push occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(5f)]\n[BaseEntity.RPC_Server]\npublic void RPC_WantsPush(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!player.isMounted && !RecentlyPushed && CanPushNow(player) && !(rigidBody == null) && (!OnlyOwnerAccessible() || !(player != creatorEntity)) && Oxide.Core.Interface.CallHook(\"OnVehiclePush\", this, msg.player) == null)\n\t{\n\t\tplayer.metabolism.calories.Subtract(3f);\n\t\tplayer.metabolism.SendChanges();\n\t\tif (rigidBody.IsSleeping())\n\t\t{\n\t\t\trigidBody.WakeUp();\n\t\t}\n\t\tDoPushAction(player);\n\t\ttimeSinceLastPush = 0f;\n\t}\n}\n",
      "ParametersText": "BaseVehicle baseVehicle, BasePlayer player",
      "TargetName": "BaseVehicle",
      "MethodName": "RPC_WantsPush",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 733130680,
      "Name": "OnEngineStatsRefresh",
      "FullName": "OnEngineStatsRefresh",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "vehicleModuleEngine",
          "typeName": "VehicleModuleEngine",
          "optional": false
        },
        {
          "name": "engineStorage",
          "typeName": "Rust.Modular.EngineStorage",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when engine stats refresh occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RefreshPerformanceStats(Rust.Modular.EngineStorage engineStorage)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEngineStatsRefresh\", this, engineStorage) == null)\n\t{\n\t\tif (engineStorage == null)\n\t\t{\n\t\t\tIsUsable = false;\n\t\t\tPerformanceFractionAcceleration = 0f;\n\t\t\tPerformanceFractionTopSpeed = 0f;\n\t\t\tPerformanceFractionFuelEconomy = 0f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIsUsable = engineStorage.isUsable;\n\t\t\tPerformanceFractionAcceleration = GetPerformanceFraction(engineStorage.accelerationBoostPercent);\n\t\t\tPerformanceFractionTopSpeed = GetPerformanceFraction(engineStorage.topSpeedBoostPercent);\n\t\t\tPerformanceFractionFuelEconomy = GetPerformanceFraction(engineStorage.fuelEconomyBoostPercent);\n\t\t}\n\t\tOverallPerformanceFraction = (PerformanceFractionAcceleration + PerformanceFractionTopSpeed + PerformanceFractionFuelEconomy) / 3f;\n\t\tOxide.Core.Interface.CallHook(\"OnEngineStatsRefreshed\", this, engineStorage);\n\t}\n}\n",
      "ParametersText": "VehicleModuleEngine vehicleModuleEngine, Rust.Modular.EngineStorage engineStorage",
      "TargetName": "VehicleModuleEngine",
      "MethodName": "RefreshPerformanceStats",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1632415359,
      "Name": "OnEngineStatsRefreshed",
      "FullName": "OnEngineStatsRefreshed",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "vehicleModuleEngine",
          "typeName": "VehicleModuleEngine",
          "optional": false
        },
        {
          "name": "engineStorage",
          "typeName": "Rust.Modular.EngineStorage",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine stats is refreshed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RefreshPerformanceStats(Rust.Modular.EngineStorage engineStorage)\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEngineStatsRefresh\", this, engineStorage) == null)\n\t{\n\t\tif (engineStorage == null)\n\t\t{\n\t\t\tIsUsable = false;\n\t\t\tPerformanceFractionAcceleration = 0f;\n\t\t\tPerformanceFractionTopSpeed = 0f;\n\t\t\tPerformanceFractionFuelEconomy = 0f;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tIsUsable = engineStorage.isUsable;\n\t\t\tPerformanceFractionAcceleration = GetPerformanceFraction(engineStorage.accelerationBoostPercent);\n\t\t\tPerformanceFractionTopSpeed = GetPerformanceFraction(engineStorage.topSpeedBoostPercent);\n\t\t\tPerformanceFractionFuelEconomy = GetPerformanceFraction(engineStorage.fuelEconomyBoostPercent);\n\t\t}\n\t\tOverallPerformanceFraction = (PerformanceFractionAcceleration + PerformanceFractionTopSpeed + PerformanceFractionFuelEconomy) / 3f;\n\t\tOxide.Core.Interface.CallHook(\"OnEngineStatsRefreshed\", this, engineStorage);\n\t}\n}\n",
      "ParametersText": "VehicleModuleEngine vehicleModuleEngine, Rust.Modular.EngineStorage engineStorage",
      "TargetName": "VehicleModuleEngine",
      "MethodName": "RefreshPerformanceStats",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1211293448,
      "Name": "OnVehicleModulesAssign",
      "FullName": "OnVehicleModulesAssign",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCar",
          "typeName": "ModularCar",
          "optional": false
        },
        {
          "name": "socketItemDefs",
          "typeName": "Rust.Modular.ItemModVehicleModule[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when vehicle modules assign occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SpawnPreassignedModules()\n{\n\tif (!spawnSettings.useSpawnSettings || CollectionEx.IsNullOrEmpty(spawnSettings.configurationOptions))\n\t{\n\t\treturn;\n\t}\n\tModularCarPresetConfig modularCarPresetConfig = spawnSettings.configurationOptions[UnityEngine.Random.Range(0, spawnSettings.configurationOptions.Length)];\n\tif (Oxide.Core.Interface.CallHook(\"OnVehicleModulesAssign\", this, modularCarPresetConfig.socketItemDefs) != null)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i < modularCarPresetConfig.socketItemDefs.Length; i++)\n\t{\n\t\tRust.Modular.ItemModVehicleModule itemModVehicleModule = modularCarPresetConfig.socketItemDefs[i];\n\t\tif (itemModVehicleModule != null && base.Inventory.SocketsAreFree(i, itemModVehicleModule.socketsTaken))\n\t\t{\n\t\t\tItem item = ItemManager.Create(itemModVehicleModule.GetComponent<ItemDefinition>(), 1, 0uL);\n\t\t\tfloat num = UnityEngine.Random.Range(spawnSettings.minStartHealthPercent, spawnSettings.maxStartHealthPercent);\n\t\t\titem.condition = item.maxCondition * num;\n\t\t\tif (!TryAddModule(item))\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t}\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnVehicleModulesAssigned\", this, modularCarPresetConfig.socketItemDefs);\n\tInvoke(HandleAdminBonus, 0f);\n}\n",
      "ParametersText": "ModularCar modularCar, Rust.Modular.ItemModVehicleModule[] socketItemDefs",
      "TargetName": "ModularCar",
      "MethodName": "SpawnPreassignedModules",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 646458517,
      "Name": "OnVehicleModulesAssigned",
      "FullName": "OnVehicleModulesAssigned",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCar",
          "typeName": "ModularCar",
          "optional": false
        },
        {
          "name": "socketItemDefs",
          "typeName": "Rust.Modular.ItemModVehicleModule[]",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vehicle modules is assigned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SpawnPreassignedModules()\n{\n\tif (!spawnSettings.useSpawnSettings || CollectionEx.IsNullOrEmpty(spawnSettings.configurationOptions))\n\t{\n\t\treturn;\n\t}\n\tModularCarPresetConfig modularCarPresetConfig = spawnSettings.configurationOptions[UnityEngine.Random.Range(0, spawnSettings.configurationOptions.Length)];\n\tif (Oxide.Core.Interface.CallHook(\"OnVehicleModulesAssign\", this, modularCarPresetConfig.socketItemDefs) != null)\n\t{\n\t\treturn;\n\t}\n\tfor (int i = 0; i < modularCarPresetConfig.socketItemDefs.Length; i++)\n\t{\n\t\tRust.Modular.ItemModVehicleModule itemModVehicleModule = modularCarPresetConfig.socketItemDefs[i];\n\t\tif (itemModVehicleModule != null && base.Inventory.SocketsAreFree(i, itemModVehicleModule.socketsTaken))\n\t\t{\n\t\t\tItem item = ItemManager.Create(itemModVehicleModule.GetComponent<ItemDefinition>(), 1, 0uL);\n\t\t\tfloat num = UnityEngine.Random.Range(spawnSettings.minStartHealthPercent, spawnSettings.maxStartHealthPercent);\n\t\t\titem.condition = item.maxCondition * num;\n\t\t\tif (!TryAddModule(item))\n\t\t\t{\n\t\t\t\titem.Remove();\n\t\t\t}\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnVehicleModulesAssigned\", this, modularCarPresetConfig.socketItemDefs);\n\tInvoke(HandleAdminBonus, 0f);\n}\n",
      "ParametersText": "ModularCar modularCar, Rust.Modular.ItemModVehicleModule[] socketItemDefs",
      "TargetName": "ModularCar",
      "MethodName": "SpawnPreassignedModules",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1017646668,
      "Name": "CanDestroyLock",
      "FullName": "CanDestroyLock",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "modularCar",
          "typeName": "ModularCar",
          "optional": false
        },
        {
          "name": "viaModule",
          "typeName": "BaseVehicleModule",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an admin repair action fixes nearby vehicles.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool PlayerCanDestroyLock(BasePlayer player, BaseVehicleModule viaModule)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanDestroyLock\", player, this, viaModule);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn CarLock.PlayerCanDestroyLock(viaModule);\n}\n",
      "ParametersText": "BasePlayer player, ModularCar modularCar, BaseVehicleModule viaModule",
      "TargetName": "ModularCar",
      "MethodName": "PlayerCanDestroyLock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 169597589,
      "Name": "OnVehicleModuleSelect",
      "FullName": "OnVehicleModuleSelect",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "local2",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "modularCarGarage",
          "typeName": "ModularCarGarage",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vehicle module selects."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void RPC_SelectedLootItem(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tItemId itemUID = msg.read.ItemID();\n\tif (player == null || !player.inventory.loot.IsLooting() || player.inventory.loot.entitySource != this || !HasOccupant)\n\t{\n\t\treturn;\n\t}\n\tItem vehicleItem = carOccupant.GetVehicleItem(itemUID);\n\tif (vehicleItem == null || Oxide.Core.Interface.CallHook(\"OnVehicleModuleSelect\", vehicleItem, this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = player.inventory.loot.RemoveContainerAt(3);\n\tif (TryGetModuleForItem(vehicleItem, out var result))\n\t{\n\t\tif (result is VehicleModuleStorage vehicleModuleStorage)\n\t\t{\n\t\t\tIItemContainerEntity container = vehicleModuleStorage.GetContainer();\n\t\t\tif (!ObjectEx.IsUnityNull(container))\n\t\t\t{\n\t\t\t\tplayer.inventory.loot.AddContainer(container.inventory);\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t\telse if (result is VehicleModuleCamper vehicleModuleCamper)\n\t\t{\n\t\t\tIItemContainerEntity container2 = vehicleModuleCamper.GetContainer();\n\t\t\tif (!ObjectEx.IsUnityNull(container2))\n\t\t\t{\n\t\t\t\tplayer.inventory.loot.AddContainer(container2.inventory);\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t}\n\tif (flag)\n\t{\n\t\tplayer.inventory.loot.SendImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnVehicleModuleSelected\", vehicleItem, this, player);\n}\n",
      "ParametersText": "Item local2, ModularCarGarage modularCarGarage, BasePlayer local0",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_SelectedLootItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3843099864,
      "Name": "OnVehicleModuleSelected",
      "FullName": "OnVehicleModuleSelected",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "local2",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "modularCarGarage",
          "typeName": "ModularCarGarage",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vehicle module is selected."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void RPC_SelectedLootItem(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tItemId itemUID = msg.read.ItemID();\n\tif (player == null || !player.inventory.loot.IsLooting() || player.inventory.loot.entitySource != this || !HasOccupant)\n\t{\n\t\treturn;\n\t}\n\tItem vehicleItem = carOccupant.GetVehicleItem(itemUID);\n\tif (vehicleItem == null || Oxide.Core.Interface.CallHook(\"OnVehicleModuleSelect\", vehicleItem, this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = player.inventory.loot.RemoveContainerAt(3);\n\tif (TryGetModuleForItem(vehicleItem, out var result))\n\t{\n\t\tif (result is VehicleModuleStorage vehicleModuleStorage)\n\t\t{\n\t\t\tIItemContainerEntity container = vehicleModuleStorage.GetContainer();\n\t\t\tif (!ObjectEx.IsUnityNull(container))\n\t\t\t{\n\t\t\t\tplayer.inventory.loot.AddContainer(container.inventory);\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t\telse if (result is VehicleModuleCamper vehicleModuleCamper)\n\t\t{\n\t\t\tIItemContainerEntity container2 = vehicleModuleCamper.GetContainer();\n\t\t\tif (!ObjectEx.IsUnityNull(container2))\n\t\t\t{\n\t\t\t\tplayer.inventory.loot.AddContainer(container2.inventory);\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t}\n\tif (flag)\n\t{\n\t\tplayer.inventory.loot.SendImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnVehicleModuleSelected\", vehicleItem, this, player);\n}\n",
      "ParametersText": "Item local2, ModularCarGarage modularCarGarage, BasePlayer local0",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_SelectedLootItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1848276154,
      "Name": "OnVehicleModuleDeselected",
      "FullName": "OnVehicleModuleDeselected",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCarGarage",
          "typeName": "ModularCarGarage",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vehicle module is deselected."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\npublic void RPC_DeselectedLootItem(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (player.inventory.loot.IsLooting() && !(player.inventory.loot.entitySource != this))\n\t{\n\t\tif (player.inventory.loot.RemoveContainerAt(3))\n\t\t{\n\t\t\tplayer.inventory.loot.SendImmediate();\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnVehicleModuleDeselected\", this, player);\n\t}\n}\n",
      "ParametersText": "ModularCarGarage modularCarGarage, BasePlayer local0",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_DeselectedLootItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2577582430,
      "Name": "OnVehicleLockRequest",
      "FullName": "OnVehicleLockRequest",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCarGarage",
          "typeName": "ModularCarGarage",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when vehicle lock request occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_RequestAddLock(BaseEntity.RPCMessage msg)\n{\n\tif (!HasOccupant || carOccupant.CarLock.HasALock)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (player == null)\n\t{\n\t\treturn;\n\t}\n\tstring text = msg.read.String();\n\tif (Oxide.Core.Interface.CallHook(\"OnVehicleLockRequest\", this, player, text) == null)\n\t{\n\t\tItemAmount itemAmount = lockResourceCost;\n\t\tif ((float)player.inventory.GetAmount(itemAmount.itemDef.itemid) >= itemAmount.amount && carOccupant.CarLock.TryAddALock(text, player.userID))\n\t\t{\n\t\t\tplayer.inventory.Take(null, itemAmount.itemDef.itemid, UnityEngine.Mathf.CeilToInt(itemAmount.amount));\n\t\t\tEffect.server.Run(addRemoveLockEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ModularCarGarage modularCarGarage, BasePlayer local0, string local1",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_RequestAddLock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1003872762,
      "Name": "OnLockRemove",
      "FullName": "OnLockRemove",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCarGarage",
          "typeName": "ModularCarGarage",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a lock is removed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsVisible(3f)]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void RPC_RequestRemoveLock(BaseEntity.RPCMessage msg)\n{\n\tif (HasOccupant && carOccupant.CarLock.HasALock && Oxide.Core.Interface.CallHook(\"OnLockRemove\", carOccupant, msg.player) == null)\n\t{\n\t\tcarOccupant.CarLock.RemoveLock();\n\t\tEffect.server.Run(addRemoveLockEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t}\n}\n",
      "ParametersText": "ModularCarGarage modularCarGarage, BasePlayer player",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_RequestRemoveLock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4175593290,
      "Name": "OnCodeChange",
      "FullName": "OnCodeChange",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCarGarage",
          "typeName": "ModularCarGarage",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a code is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server.IsVisible(3f)]\npublic void RPC_RequestNewCode(BaseEntity.RPCMessage msg)\n{\n\tif (!HasOccupant || !carOccupant.CarLock.HasALock)\n\t{\n\t\treturn;\n\t}\n\tBasePlayer player = msg.player;\n\tif (!(player == null))\n\t{\n\t\tstring text = msg.read.String();\n\t\tif (Oxide.Core.Interface.CallHook(\"OnCodeChange\", carOccupant, player, text) == null && carOccupant.CarLock.TrySetNewCode(text, player.userID))\n\t\t{\n\t\t\tEffect.server.Run(changeLockCodeEffect.resourcePath, this, 0u, UnityEngine.Vector3.zero, UnityEngine.Vector3.zero);\n\t\t}\n\t}\n}\n",
      "ParametersText": "ModularCarGarage modularCarGarage, BasePlayer local0, string local1",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_RequestNewCode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3825140817,
      "Name": "OnVehicleModuleSelectedFix [patch]",
      "FullName": "OnVehicleModuleSelectedFix [patch]",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 2,
      "Descriptions": null,
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\npublic void RPC_SelectedLootItem(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tItemId itemUID = msg.read.ItemID();\n\tif (player == null || !player.inventory.loot.IsLooting() || player.inventory.loot.entitySource != this || !HasOccupant)\n\t{\n\t\treturn;\n\t}\n\tItem vehicleItem = carOccupant.GetVehicleItem(itemUID);\n\tif (vehicleItem == null || Oxide.Core.Interface.CallHook(\"OnVehicleModuleSelect\", vehicleItem, this, player) != null)\n\t{\n\t\treturn;\n\t}\n\tbool flag = player.inventory.loot.RemoveContainerAt(3);\n\tif (TryGetModuleForItem(vehicleItem, out var result))\n\t{\n\t\tif (result is VehicleModuleStorage vehicleModuleStorage)\n\t\t{\n\t\t\tIItemContainerEntity container = vehicleModuleStorage.GetContainer();\n\t\t\tif (!ObjectEx.IsUnityNull(container))\n\t\t\t{\n\t\t\t\tplayer.inventory.loot.AddContainer(container.inventory);\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t\telse if (result is VehicleModuleCamper vehicleModuleCamper)\n\t\t{\n\t\t\tIItemContainerEntity container2 = vehicleModuleCamper.GetContainer();\n\t\t\tif (!ObjectEx.IsUnityNull(container2))\n\t\t\t{\n\t\t\t\tplayer.inventory.loot.AddContainer(container2.inventory);\n\t\t\t\tflag = true;\n\t\t\t}\n\t\t}\n\t}\n\tif (flag)\n\t{\n\t\tplayer.inventory.loot.SendImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnVehicleModuleSelected\", vehicleItem, this, player);\n}\n",
      "ParametersText": "",
      "TargetName": "ModularCarGarage",
      "MethodName": "RPC_SelectedLootItem",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1488526457,
      "Name": "OnVehicleLockableCheck",
      "FullName": "OnVehicleLockableCheck",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "modularCarCodeLock",
          "typeName": "ModularCarCodeLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when vehicle lockable check occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool CanHaveALock()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnVehicleLockableCheck\", this);\n\tif (obj != null)\n\t{\n\t\tif (!(obj is bool))\n\t\t{\n\t\t\treturn false;\n\t\t}\n\t\treturn (bool)obj;\n\t}\n\tif (!owner.IsDead())\n\t{\n\t\treturn owner.HasDriverMountPoints();\n\t}\n\treturn false;\n}\n",
      "ParametersText": "ModularCarCodeLock modularCarCodeLock",
      "TargetName": "ModularCarCodeLock",
      "MethodName": "CanHaveALock",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 1531266972,
      "Name": "CanLock",
      "FullName": "CanLock",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "modularCarCodeLock",
          "typeName": "ModularCarCodeLock",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "ModularCarCodeLock",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to lock.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool HasLockPermission(ulong steamId)\n{\n\tif (!HasALock)\n\t{\n\t\treturn true;\n\t}\n\treturn whitelistPlayers.Contains(steamId);\n}\n",
      "ParametersText": "BasePlayer player, ModularCarCodeLock modularCarCodeLock, ModularCarCodeLock self1",
      "TargetName": "ModularCarCodeLock",
      "MethodName": "HasLockPermission",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 991351741,
      "Name": "OnEngineLoadoutRefresh",
      "FullName": "OnEngineLoadoutRefresh",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "rust.Modular.EngineStorage",
          "typeName": "Rust.Modular.EngineStorage",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when engine loadout refresh occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void RefreshLoadoutData()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnEngineLoadoutRefresh\", this) == null)\n\t{\n\t\tisUsable = base.inventory.IsFull() && System.Linq.Enumerable.All(base.inventory.itemList, (Item item) => !item.isBroken);\n\t\taccelerationBoostPercent = GetContainerItemsValueFor(Rust.Modular.EngineItemTypeEx.BoostsAcceleration) / (float)accelerationBoostSlots;\n\t\ttopSpeedBoostPercent = GetContainerItemsValueFor(Rust.Modular.EngineItemTypeEx.BoostsTopSpeed) / (float)topSpeedBoostSlots;\n\t\tfuelEconomyBoostPercent = GetContainerItemsValueFor(Rust.Modular.EngineItemTypeEx.BoostsFuelEconomy) / (float)fuelEconomyBoostSlots;\n\t\tSendNetworkUpdate();\n\t\tGetEngineModule()?.RefreshPerformanceStats(this);\n\t}\n}\n",
      "ParametersText": "Rust.Modular.EngineStorage rust.Modular.EngineStorage",
      "TargetName": "Rust.Modular.EngineStorage",
      "MethodName": "RefreshLoadoutData",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4233058086,
      "Name": "OnVehicleModuleMove",
      "FullName": "OnVehicleModuleMove",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BaseVehicleModule",
          "optional": false
        },
        {
          "name": "baseModularVehicle",
          "typeName": "BaseModularVehicle",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an admin repair action fixes nearby vehicles."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public PlayerInventory.CanMoveFromResponse CanMoveFrom(BasePlayer player, Item item)\n{\n\tif (item.info.GetComponent<Rust.Modular.ItemModVehicleChassis>() != null)\n\t{\n\t\treturn PlayerInventory.CanMoveFromResponse.Failure(Rust.Modular.ItemModVehicleChassis.CantMoveChassisError);\n\t}\n\tBaseVehicleModule moduleForItem = GetModuleForItem(item);\n\tif (moduleForItem != null)\n\t{\n\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnVehicleModuleMove\", moduleForItem, this, player);\n\t\tif (obj is PlayerInventory.CanMoveFromResponse)\n\t\t{\n\t\t\treturn (PlayerInventory.CanMoveFromResponse)obj;\n\t\t}\n\t\treturn new PlayerInventory.CanMoveFromResponse(moduleForItem.CanBeMovedNow(), moduleForItem.CannotBeMovedNowReason());\n\t}\n\treturn PlayerInventory.CanMoveFromResponse.Success();\n}\n",
      "ParametersText": "BaseVehicleModule local0, BaseModularVehicle baseModularVehicle, BasePlayer player",
      "TargetName": "BaseModularVehicle",
      "MethodName": "CanMoveFrom",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "PlayerInventory.CanMoveFromResponse"
    },
    {
      "Id": 1918182502,
      "Name": "OnMlrsFire",
      "FullName": "OnMlrsFire",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "mLRS",
          "typeName": "MLRS",
          "optional": false
        },
        {
          "name": "owner",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an mlrs fires."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Fire(BasePlayer owner)\n{\n\tUpdateStorageState();\n\tif (CanFire && !(GetMounted() == null) && Oxide.Core.Interface.CallHook(\"OnMlrsFire\", this, owner) == null)\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved6, b: true);\n\t\tradiusModIndex = 0;\n\t\tnextRocketIndex = UnityEngine.Mathf.Min(RocketAmmoCount - 1, rocketTubes.Length - 1);\n\t\trocketOwnerRef.Set(owner);\n\t\tInvokeRepeating(FireNextRocket, 0f, 0.5f);\n\t\tOxide.Core.Interface.CallHook(\"OnMlrsFired\", this, owner);\n\t}\n}\n",
      "ParametersText": "MLRS mLRS, BasePlayer owner",
      "TargetName": "MLRS",
      "MethodName": "Fire",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3738224274,
      "Name": "OnMlrsFired",
      "FullName": "OnMlrsFired",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "mLRS",
          "typeName": "MLRS",
          "optional": false
        },
        {
          "name": "owner",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an mlrs is fired."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void Fire(BasePlayer owner)\n{\n\tUpdateStorageState();\n\tif (CanFire && !(GetMounted() == null) && Oxide.Core.Interface.CallHook(\"OnMlrsFire\", this, owner) == null)\n\t{\n\t\tSetFlag(BaseEntity.Flags.Reserved6, b: true);\n\t\tradiusModIndex = 0;\n\t\tnextRocketIndex = UnityEngine.Mathf.Min(RocketAmmoCount - 1, rocketTubes.Length - 1);\n\t\trocketOwnerRef.Set(owner);\n\t\tInvokeRepeating(FireNextRocket, 0f, 0.5f);\n\t\tOxide.Core.Interface.CallHook(\"OnMlrsFired\", this, owner);\n\t}\n}\n",
      "ParametersText": "MLRS mLRS, BasePlayer owner",
      "TargetName": "MLRS",
      "MethodName": "Fire",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1771587149,
      "Name": "OnMlrsRocketFired",
      "FullName": "OnMlrsRocketFired",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "mLRS",
          "typeName": "MLRS",
          "optional": false
        },
        {
          "name": "local7",
          "typeName": "ServerProjectile",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an mlrs rocket is fired."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FireNextRocket()\n{\n\tRocketAmmoCount = GetRocketContainer().inventory.GetAmmoAmount(Rust.AmmoTypes.MLRS_ROCKET);\n\tif (nextRocketIndex < 0 || nextRocketIndex >= RocketAmmoCount || IsBroken())\n\t{\n\t\tEndFiring();\n\t\treturn;\n\t}\n\tStorageContainer rocketContainer = GetRocketContainer();\n\tUnityEngine.Vector3 firingPos = firingPoint.position + firingPoint.rotation * rocketTubes[nextRocketIndex].firingOffset;\n\tfloat num = 1f;\n\tif (radiusModIndex < radiusMods.Length)\n\t{\n\t\tnum = radiusMods[radiusModIndex];\n\t}\n\tradiusModIndex++;\n\tUnityEngine.Vector2 vector = UnityEngine.Random.insideUnitCircle * (targetAreaRadius - RocketDamageRadius) * num;\n\tUnityEngine.Vector3 target = TrueHitPos + new UnityEngine.Vector3(vector.x, 0f, vector.y);\n\tfloat requiredGravity;\n\tUnityEngine.Vector3 aimToTarget = Ballistics.GetAimToTarget(firingPoint.position, target, rocketSpeed, vRotMax, rocketBaseGravity, minRange, out requiredGravity);\n\tif (TryFireProjectile(rocketContainer, Rust.AmmoTypes.MLRS_ROCKET, firingPos, aimToTarget, rocketOwnerRef.Get(serverside: true) as BasePlayer, 0f, 0f, out var projectile))\n\t{\n\t\tprojectile.gravityModifier = requiredGravity / (0f - UnityEngine.Physics.gravity.y);\n\t\tOxide.Core.Interface.CallHook(\"OnMlrsRocketFired\", this, projectile);\n\t\tnextRocketIndex--;\n\t}\n\telse\n\t{\n\t\tEndFiring();\n\t}\n}\n",
      "ParametersText": "MLRS mLRS, ServerProjectile local7",
      "TargetName": "MLRS",
      "MethodName": "FireNextRocket",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3415488350,
      "Name": "OnMlrsFiringEnded",
      "FullName": "OnMlrsFiringEnded",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "mLRS",
          "typeName": "MLRS",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an mlrs firing ends."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EndFiring()\n{\n\tCancelInvoke(FireNextRocket);\n\trocketOwnerRef.Set(null);\n\tif (TryGetAimingModule(out var item))\n\t{\n\t\titem.LoseCondition(1f);\n\t}\n\tSetFlag(BaseEntity.Flags.Reserved6, b: false, recursive: false, networkupdate: false);\n\tSetFlag(BaseEntity.Flags.Broken, b: true, recursive: false, networkupdate: false);\n\tSendNetworkUpdate_Flags();\n\ttimeSinceBroken = 0f;\n\tOxide.Core.Interface.CallHook(\"OnMlrsFiringEnded\", this);\n}\n",
      "ParametersText": "MLRS mLRS",
      "TargetName": "MLRS",
      "MethodName": "EndFiring",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2380710280,
      "Name": "OnMlrsTarget",
      "FullName": "OnMlrsTarget",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "mLRS",
          "typeName": "MLRS",
          "optional": false
        },
        {
          "name": "worldPos",
          "typeName": "UnityEngine.Vector3",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "MLRS",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when mlrs target occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetUserTargetHitPos(UnityEngine.Vector3 worldPos)\n{\n\tif (UserTargetHitPos == worldPos)\n\t{\n\t\treturn;\n\t}\n\tif (base.isServer)\n\t{\n\t\tUnityEngine.Vector3 position = TerrainMeta.Position;\n\t\tUnityEngine.Vector3 vector = position + TerrainMeta.Size;\n\t\tworldPos.x = UnityEngine.Mathf.Clamp(worldPos.x, position.x, vector.x);\n\t\tworldPos.z = UnityEngine.Mathf.Clamp(worldPos.z, position.z, vector.z);\n\t\tworldPos.y = GetSurfaceHeight(worldPos);\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnMlrsTarget\", this, worldPos, _mounted) != null)\n\t{\n\t\treturn;\n\t}\n\tUserTargetHitPos = worldPos;\n\tif (base.isServer)\n\t{\n\t\ttrueTargetHitPos = UserTargetHitPos;\n\t\tforeach (TriggerSafeZone allSafeZone in TriggerSafeZone.allSafeZones)\n\t\t{\n\t\t\tUnityEngine.Vector3 center = allSafeZone.triggerCollider.bounds.center;\n\t\t\tcenter.y = 0f;\n\t\t\tfloat num = UnityEngine.ColliderEx.GetRadius(allSafeZone.triggerCollider, allSafeZone.transform.localScale) + targetAreaRadius;\n\t\t\ttrueTargetHitPos.y = 0f;\n\t\t\tif (UnityEngine.Vector3.Distance(center, trueTargetHitPos) < num)\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 vector2 = trueTargetHitPos - center;\n\t\t\t\ttrueTargetHitPos = center + vector2.normalized * num;\n\t\t\t\ttrueTargetHitPos.y = GetSurfaceHeight(trueTargetHitPos);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnMlrsTargetSet\", this, trueTargetHitPos, _mounted);\n}\n",
      "ParametersText": "MLRS mLRS, UnityEngine.Vector3 worldPos, MLRS self1",
      "TargetName": "MLRS",
      "MethodName": "SetUserTargetHitPos",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3172418072,
      "Name": "OnMlrsTargetSet",
      "FullName": "OnMlrsTargetSet",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "mLRS",
          "typeName": "MLRS",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "MLRS",
          "optional": false
        },
        {
          "name": "self2",
          "typeName": "MLRS",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when mlrs target set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void SetUserTargetHitPos(UnityEngine.Vector3 worldPos)\n{\n\tif (UserTargetHitPos == worldPos)\n\t{\n\t\treturn;\n\t}\n\tif (base.isServer)\n\t{\n\t\tUnityEngine.Vector3 position = TerrainMeta.Position;\n\t\tUnityEngine.Vector3 vector = position + TerrainMeta.Size;\n\t\tworldPos.x = UnityEngine.Mathf.Clamp(worldPos.x, position.x, vector.x);\n\t\tworldPos.z = UnityEngine.Mathf.Clamp(worldPos.z, position.z, vector.z);\n\t\tworldPos.y = GetSurfaceHeight(worldPos);\n\t}\n\tif (Oxide.Core.Interface.CallHook(\"OnMlrsTarget\", this, worldPos, _mounted) != null)\n\t{\n\t\treturn;\n\t}\n\tUserTargetHitPos = worldPos;\n\tif (base.isServer)\n\t{\n\t\ttrueTargetHitPos = UserTargetHitPos;\n\t\tforeach (TriggerSafeZone allSafeZone in TriggerSafeZone.allSafeZones)\n\t\t{\n\t\t\tUnityEngine.Vector3 center = allSafeZone.triggerCollider.bounds.center;\n\t\t\tcenter.y = 0f;\n\t\t\tfloat num = UnityEngine.ColliderEx.GetRadius(allSafeZone.triggerCollider, allSafeZone.transform.localScale) + targetAreaRadius;\n\t\t\ttrueTargetHitPos.y = 0f;\n\t\t\tif (UnityEngine.Vector3.Distance(center, trueTargetHitPos) < num)\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 vector2 = trueTargetHitPos - center;\n\t\t\t\ttrueTargetHitPos = center + vector2.normalized * num;\n\t\t\t\ttrueTargetHitPos.y = GetSurfaceHeight(trueTargetHitPos);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tOxide.Core.Interface.CallHook(\"OnMlrsTargetSet\", this, trueTargetHitPos, _mounted);\n}\n",
      "ParametersText": "MLRS mLRS, MLRS self1, MLRS self2",
      "TargetName": "MLRS",
      "MethodName": "SetUserTargetHitPos",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2832217056,
      "Name": "OnTrainCarUncouple",
      "FullName": "OnTrainCarUncouple",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "trainCar",
          "typeName": "TrainCar",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when train car uncouple occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\npublic void RPC_WantsUncouple(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!(player == null) && !(UnityEngine.Vector3.SqrMagnitude(base.transform.position - player.transform.position) > 200f) && Oxide.Core.Interface.CallHook(\"OnTrainCarUncouple\", this, msg.player) == null)\n\t{\n\t\tbool front = msg.read.Bit();\n\t\tcoupling.Uncouple(front);\n\t}\n}\n",
      "ParametersText": "TrainCar trainCar, BasePlayer player",
      "TargetName": "TrainCar",
      "MethodName": "RPC_WantsUncouple",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 409706419,
      "Name": "CanTrainCarCouple",
      "FullName": "CanTrainCarCouple",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "trainCoupling",
          "typeName": "TrainCoupling",
          "optional": false
        },
        {
          "name": "owner",
          "typeName": "TrainCar",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to train car couple.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool TryCouple(TrainCoupling theirCoupling, bool reflect)\n{\n\tif (!isValid)\n\t{\n\t\treturn false;\n\t}\n\tif (CoupledTo == theirCoupling)\n\t{\n\t\treturn true;\n\t}\n\tif (IsCoupled)\n\t{\n\t\treturn false;\n\t}\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanTrainCarCouple\", owner, theirCoupling.owner);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (reflect && !theirCoupling.TryCouple(this, reflect: false))\n\t{\n\t\treturn false;\n\t}\n\tCoupledTo = theirCoupling;\n\towner.SetFlag(flag, b: true, recursive: false, networkupdate: false);\n\towner.SendNetworkUpdate();\n\treturn true;\n}\n",
      "ParametersText": "TrainCoupling trainCoupling, TrainCar owner",
      "TargetName": "TrainCoupling",
      "MethodName": "TryCouple",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3270587095,
      "Name": "OnVehicleHornPressed",
      "FullName": "OnVehicleHornPressed",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "vehicleModuleSeating",
          "typeName": "VehicleModuleSeating",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a vehicle horn is pressed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void PlayerServerInput(InputState inputState, BasePlayer player)\n{\n\tbase.PlayerServerInput(inputState, player);\n\tif (hornLoop != null && IsOnThisModule(player))\n\t{\n\t\tbool flag = inputState.IsDown(BUTTON.FIRE_PRIMARY);\n\t\tif (flag != HasFlag(BaseEntity.Flags.Reserved8))\n\t\t{\n\t\t\tSetFlag(BaseEntity.Flags.Reserved8, flag);\n\t\t}\n\t\tif (flag)\n\t\t{\n\t\t\tOxide.Core.Interface.CallHook(\"OnVehicleHornPressed\", this, player);\n\t\t\thornPlayer = player;\n\t\t}\n\t}\n}\n",
      "ParametersText": "VehicleModuleSeating vehicleModuleSeating, BasePlayer player",
      "TargetName": "VehicleModuleSeating",
      "MethodName": "PlayerServerInput",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1460091328,
      "Name": "OnCupboardAuthorize",
      "FullName": "OnCupboardAuthorize [VehiclePrivilege]",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "vehiclePrivilege",
          "typeName": "VehiclePrivilege",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cupboard authorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.MaxDistance(3f)]\n[BaseEntity.RPC_Server]\nprivate void AddSelfAuthorize(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && CanModifyAuth(rpc.player) && Oxide.Core.Interface.CallHook(\"OnCupboardAuthorize\", this, rpc.player) == null)\n\t{\n\t\tAddPlayer(rpc.player);\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "VehiclePrivilege vehiclePrivilege, BasePlayer player",
      "TargetName": "VehiclePrivilege",
      "MethodName": "AddSelfAuthorize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1037905375,
      "Name": "OnCupboardDeauthorize",
      "FullName": "OnCupboardDeauthorize [VehiclePrivilege]",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "vehiclePrivilege",
          "typeName": "VehiclePrivilege",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cupboard deauthorize occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void RemoveSelfAuthorize(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && CanModifyAuth(rpc.player) && Oxide.Core.Interface.CallHook(\"OnCupboardDeauthorize\", this, rpc.player) == null)\n\t{\n\t\tauthorizedPlayers.Remove(rpc.player.userID);\n\t\tFacepunch.Rust.Analytics.Azure.OnEntityAuthChanged(this, rpc.player, authorizedPlayers, \"removed\", rpc.player.userID);\n\t\tUpdateMaxAuthCapacity();\n\t\tUpdatePrivilegeReceivers();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "VehiclePrivilege vehiclePrivilege, BasePlayer player",
      "TargetName": "VehiclePrivilege",
      "MethodName": "RemoveSelfAuthorize",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1797143416,
      "Name": "OnCupboardClearList",
      "FullName": "OnCupboardClearList [VehiclePrivilege]",
      "Category": "Vehicle",
      "Parameters": [
        {
          "name": "vehiclePrivilege",
          "typeName": "VehiclePrivilege",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when cupboard clear list occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.MaxDistance(3f)]\nprivate void ClearList(BaseEntity.RPCMessage rpc)\n{\n\tif (rpc.player.CanInteract() && CanModifyAuth(rpc.player) && Oxide.Core.Interface.CallHook(\"OnCupboardClearList\", this, rpc.player) == null)\n\t{\n\t\tauthorizedPlayers.Clear();\n\t\tUpdateMaxAuthCapacity();\n\t\tUpdatePrivilegeReceivers();\n\t\tSendNetworkUpdate();\n\t}\n}\n",
      "ParametersText": "VehiclePrivilege vehiclePrivilege, BasePlayer player",
      "TargetName": "VehiclePrivilege",
      "MethodName": "ClearList",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1113127637,
      "Name": "OnEngineStart",
      "FullName": "OnEngineStart [MotorRowboat]",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EngineToggle(bool wantsOn)\n{\n\tif (!fuelSystem.HasFuel(forceCheck: true))\n\t{\n\t\treturn;\n\t}\n\tBasePlayer driver = GetDriver();\n\tif (!wantsOn || Oxide.Core.Interface.CallHook(\"OnEngineStart\", this, driver) == null)\n\t{\n\t\tSetFlag(BaseEntity.Flags.On, wantsOn);\n\t\tif (wantsOn)\n\t\t{\n\t\t\tOxide.Core.Interface.CallHook(\"OnEngineStarted\", this, driver);\n\t\t}\n\t\tif (wantsOn)\n\t\t{\n\t\t\trigidBody.WakeUp();\n\t\t\tbuoyancy.Wake();\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "MotorRowboat",
      "MethodName": "EngineToggle",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 557013772,
      "Name": "OnEngineStarted",
      "FullName": "OnEngineStarted [MotorRowboat]",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void EngineToggle(bool wantsOn)\n{\n\tif (!fuelSystem.HasFuel(forceCheck: true))\n\t{\n\t\treturn;\n\t}\n\tBasePlayer driver = GetDriver();\n\tif (!wantsOn || Oxide.Core.Interface.CallHook(\"OnEngineStart\", this, driver) == null)\n\t{\n\t\tSetFlag(BaseEntity.Flags.On, wantsOn);\n\t\tif (wantsOn)\n\t\t{\n\t\t\tOxide.Core.Interface.CallHook(\"OnEngineStarted\", this, driver);\n\t\t}\n\t\tif (wantsOn)\n\t\t{\n\t\t\trigidBody.WakeUp();\n\t\t\tbuoyancy.Wake();\n\t\t}\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "MotorRowboat",
      "MethodName": "EngineToggle",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1113127637,
      "Name": "OnEngineStart",
      "FullName": "OnEngineStart",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "VehicleEngineController`1",
      "MethodName": "TryStartEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 557013772,
      "Name": "OnEngineStarted",
      "FullName": "OnEngineStarted",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine starts."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "VehicleEngineController`1",
      "MethodName": "TryStartEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3054039405,
      "Name": "OnEngineStop",
      "FullName": "OnEngineStop",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "VehicleEngineController`1",
      "MethodName": "StopEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2219194520,
      "Name": "OnEngineStopped",
      "FullName": "OnEngineStopped",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "VehicleEngineController`1",
      "MethodName": "StopEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3612603867,
      "Name": "OnEngineStartFinished",
      "FullName": "OnEngineStartFinished",
      "Category": "Vehicle",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when an engine start finishes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "",
      "TargetName": "VehicleEngineController`1",
      "MethodName": "FinishStartingEngine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "Weapon": [
    {
      "Id": 1930466752,
      "Name": "OnExplosiveThrown",
      "FullName": "OnExplosiveThrown",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "thrownWeapon",
          "typeName": "ThrownWeapon",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when explosive thrown occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server]\nprivate void DoThrow(BaseEntity.RPCMessage msg)\n{\n\tif (HasItemAmount() && !HasAttackCooldown())\n\t{\n\t\tUnityEngine.Vector3 eyePos = msg.read.Vector3();\n\t\tUnityEngine.Vector3 normalized = msg.read.Vector3().normalized;\n\t\tfloat throwScale = UnityEngine.Mathf.Clamp01(msg.read.Float());\n\t\tif (DoValidationChecks(ref eyePos, normalized, msg.player, throwScale))\n\t\t{\n\t\t\tDoThrowImpl(eyePos, normalized, msg.player, out var thrownEntity, throwScale);\n\t\t\tOxide.Core.Interface.CallHook(\"OnExplosiveThrown\", msg.player, thrownEntity, this);\n\t\t\tUseItemAmount(1, reduceItemOwnership: false);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer player, BaseEntity local4, ThrownWeapon thrownWeapon",
      "TargetName": "ThrownWeapon",
      "MethodName": "DoThrow",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 565209634,
      "Name": "OnExplosiveDropped",
      "FullName": "OnExplosiveDropped",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "BaseEntity",
          "optional": false
        },
        {
          "name": "thrownWeapon",
          "typeName": "ThrownWeapon",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an explosive is dropped."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void DoDrop(BaseEntity.RPCMessage msg)\n{\n\tif (!HasItemAmount() || HasAttackCooldown() || (!canThrowUnderwater && msg.player.IsHeadUnderwater()) || (!canThrowFromHelicopter && msg.player.IsInAHelicopter()))\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 vector = msg.read.Vector3();\n\tUnityEngine.Vector3 normalized = msg.read.Vector3().normalized;\n\tif (msg.player.isMounted || msg.player.HasParent())\n\t{\n\t\tvector = msg.player.eyes.position;\n\t}\n\telse if (!ValidateEyePos(msg.player, vector))\n\t{\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = GameManager.server.CreateEntity(prefabToThrow.resourcePath, vector, UnityEngine.Quaternion.LookRotation(UnityEngine.Vector3.up));\n\tif (baseEntity == null)\n\t{\n\t\treturn;\n\t}\n\tif (canStick && UnityEngine.Physics.SphereCast(new UnityEngine.Ray(vector, normalized), 0.05f, out var hitInfo, 1.5f, 1237003025))\n\t{\n\t\tUnityEngine.Vector3 point = hitInfo.point;\n\t\tUnityEngine.Vector3 normal = hitInfo.normal;\n\t\tBaseEntity entity = RaycastHitEx.GetEntity(hitInfo);\n\t\tUnityEngine.Collider collider = hitInfo.collider;\n\t\tif ((bool)entity && entity is StabilityEntity && baseEntity is TimedExplosive)\n\t\t{\n\t\t\tentity = entity.ToServer<BaseEntity>();\n\t\t\tTimedExplosive timedExplosive = baseEntity as TimedExplosive;\n\t\t\ttimedExplosive.onlyDamageParent = true;\n\t\t\ttimedExplosive.DoStick(point, normal, entity, collider);\n\t\t\tFacepunch.Rust.Analytics.Azure.OnExplosiveLaunched(msg.player, timedExplosive);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbaseEntity.SetVelocity(normalized);\n\t\t}\n\t}\n\telse\n\t{\n\t\tbaseEntity.SetVelocity(normalized);\n\t}\n\tbaseEntity.creatorEntity = msg.player;\n\tbaseEntity.skinID = skinID;\n\tbaseEntity.Spawn();\n\tSetUpThrownWeapon(baseEntity, GetOwnerItem());\n\tStartAttackCooldown(repeatDelay);\n\tOxide.Core.Interface.CallHook(\"OnExplosiveDropped\", msg.player, baseEntity, this);\n\tUseItemAmount(1);\n}\n",
      "ParametersText": "BasePlayer player, BaseEntity local2, ThrownWeapon thrownWeapon",
      "TargetName": "ThrownWeapon",
      "MethodName": "DoDrop",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2248690063,
      "Name": "OnMeleeThrown",
      "FullName": "OnMeleeThrown",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when melee thrown occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void CLProject(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!VerifyClientAttack(player))\n\t{\n\t\tSendNetworkUpdate();\n\t}\n\telse\n\t{\n\t\tif (player == null || player.IsHeadUnderwater())\n\t\t{\n\t\t\treturn;\n\t\t}\n\t\tif (!canThrowAsProjectile)\n\t\t{\n\t\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Not throwable (\" + base.ShortPrefabName + \")\");\n\t\t\tplayer.stats.combat.LogInvalid(player, this, \"not_throwable\");\n\t\t\treturn;\n\t\t}\n\t\tItem item = GetItem();\n\t\tif (item == null)\n\t\t{\n\t\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Item not found (\" + base.ShortPrefabName + \")\");\n\t\t\tplayer.stats.combat.LogInvalid(player, this, \"item_missing\");\n\t\t\treturn;\n\t\t}\n\t\tItemModProjectile component = item.info.GetComponent<ItemModProjectile>();\n\t\tif (!(component == null))\n\t\t{\n\t\t\tusing (ProtoBuf.ProjectileShoot projectileShoot = msg.read.Proto<ProtoBuf.ProjectileShoot>())\n\t\t\t{\n\t\t\t\tif (projectileShoot.projectiles.Count != 1)\n\t\t\t\t{\n\t\t\t\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Projectile count mismatch (\" + base.ShortPrefabName + \")\");\n\t\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"count_mismatch\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tplayer.CleanupExpiredProjectiles();\n\t\t\t\t\tSystem.Guid projectileGroupId = System.Guid.NewGuid();\n\t\t\t\t\tforeach (ProtoBuf.ProjectileShoot.Projectile projectile in projectileShoot.projectiles)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (player.HasFiredProjectile(projectile.projectileID))\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, $\"Duplicate ID ({projectile.projectileID})\");\n\t\t\t\t\t\t\tplayer.stats.combat.LogInvalid(player, this, \"duplicate_id\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tUnityEngine.Vector3 positionOffset = UnityEngine.Vector3.zero;\n\t\t\t\t\t\t\tif (ConVar.AntiHack.projectile_positionoffset && (player.isMounted || player.HasParent()))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (!ValidateEyePos(player, projectile.startPos, checkLineOfSight: false))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tUnityEngine.Vector3 position = player.eyes.position;\n\t\t\t\t\t\t\t\tpositionOffset = position - projectile.startPos;\n\t\t\t\t\t\t\t\tprojectile.startPos = position;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (!ValidateEyePos(player, projectile.startPos))\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tItem pickupItem = (ThrowFullStack ? item : ItemManager.CreateByItemID(item.info.itemid, 1, 0uL));\n\t\t\t\t\t\t\tplayer.NoteFiredProjectile(projectile.projectileID, projectile.startPos, projectile.startVel, this, item.info, projectileGroupId, positionOffset, pickupItem);\n\t\t\t\t\t\t\tEffect effect = new Effect();\n\t\t\t\t\t\t\teffect.Init(Effect.Type.Projectile, projectile.startPos, projectile.startVel, msg.connection);\n\t\t\t\t\t\t\teffect.scale = 1f;\n\t\t\t\t\t\t\teffect.pooledString = component.GetOverrideProjectile(this).resourcePath;\n\t\t\t\t\t\t\teffect.number = projectile.seed;\n\t\t\t\t\t\t\tEffectNetwork.Send(effect);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (ThrowFullStack)\n\t\t\t\t\t{\n\t\t\t\t\t\titem.SetParent(null);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\titem.UseItem();\n\t\t\t\t\t\tif (item.amount == 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\titem.SetParent(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tOxide.Core.Interface.CallHook(\"OnMeleeThrown\", player, item);\n\t\t\t\t\tSingletonComponent<Rust.Ai.Gen2.NpcNoiseManager>.Instance.OnWeaponThrown(player, this, canAiHearIt);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Item mod not found (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"mod_missing\");\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, Item local1",
      "TargetName": "BaseMelee",
      "MethodName": "CLProject",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 658881068,
      "Name": "OnRocketLaunched",
      "FullName": "OnRocketLaunched",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local8",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a rocket is launched."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server]\nprivate void SV_Launch(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!VerifyClientAttack(player))\n\t{\n\t\tSendNetworkUpdate();\n\t\treturn;\n\t}\n\tif (reloadFinished && HasReloadCooldown())\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Reloading (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"reload_cooldown\");\n\t\treturn;\n\t}\n\treloadStarted = false;\n\treloadFinished = false;\n\tif (!base.UsingInfiniteAmmoCheat)\n\t{\n\t\tif (primaryMagazine.contents <= 0)\n\t\t{\n\t\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Launch magazine empty (\" + base.ShortPrefabName + \")\");\n\t\t\tplayer.stats.combat.LogInvalid(player, this, \"magazine_empty_launch\");\n\t\t\treturn;\n\t\t}\n\t\tModifyAmmoCount(-1);\n\t}\n\tSignalBroadcast(BaseEntity.Signal.Attack, string.Empty, player.net.connection);\n\tUnityEngine.Vector3 vector = msg.read.Vector3();\n\tUnityEngine.Vector3 vector2 = msg.read.Vector3().normalized;\n\tbool num = msg.read.Bit();\n\tBaseEntity mounted = player.GetParentEntity();\n\tif (mounted == null)\n\t{\n\t\tmounted = player.GetMounted();\n\t}\n\tif (num)\n\t{\n\t\tif (mounted != null)\n\t\t{\n\t\t\tvector = mounted.transform.TransformPoint(vector);\n\t\t\tvector2 = mounted.transform.TransformDirection(vector2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvector = player.eyes.position;\n\t\t\tvector2 = player.eyes.BodyForward();\n\t\t}\n\t}\n\tif (!ValidateEyePos(player, vector))\n\t{\n\t\treturn;\n\t}\n\tItemModProjectile component = primaryMagazine.ammoType.GetComponent<ItemModProjectile>();\n\tif (!component)\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Item mod not found (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"mod_missing\");\n\t\treturn;\n\t}\n\tfloat num2 = GetAimCone() + component.projectileSpread;\n\tif (num2 > 0f)\n\t{\n\t\tvector2 = AimConeUtil.GetModifiedAimConeDirection(num2, vector2);\n\t}\n\tfloat num3 = 1f;\n\tif (UnityEngine.Physics.Raycast(vector, vector2, out var hitInfo, num3, 1237003025))\n\t{\n\t\tnum3 = hitInfo.distance - 0.1f;\n\t}\n\tBaseEntity baseEntity = GameManager.server.CreateEntity(component.GetOverrideProjectile(this).resourcePath, vector + vector2 * num3);\n\tif (baseEntity == null)\n\t{\n\t\treturn;\n\t}\n\tbaseEntity.creatorEntity = player;\n\tServerProjectile component2 = baseEntity.GetComponent<ServerProjectile>();\n\tif ((bool)component2)\n\t{\n\t\tcomponent2.InitializeVelocity(GetInheritedVelocity(player, vector2) + vector2 * component2.speed * initialSpeedMultiplier);\n\t}\n\tbaseEntity.Spawn();\n\tProjectileLaunched_Server(component2);\n\tFacepunch.Rust.Analytics.Azure.OnExplosiveLaunched(player, baseEntity, this);\n\tOxide.Core.Interface.CallHook(\"OnRocketLaunched\", player, baseEntity);\n\tStartAttackCooldown(ScaleRepeatDelay(repeatDelay));\n\tItem ownerItem = GetOwnerItem();\n\tif (ownerItem != null)\n\t{\n\t\tif (!base.UsingInfiniteAmmoCheat)\n\t\t{\n\t\t\townerItem.LoseCondition(UnityEngine.Random.Range(1f, 2f));\n\t\t}\n\t\tBaseMountable mounted2 = player.GetMounted();\n\t\tif (mounted2 != null)\n\t\t{\n\t\t\tmounted2.OnWeaponFired(this);\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer local0, BaseEntity local8",
      "TargetName": "BaseLauncher",
      "MethodName": "SV_Launch",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1841607624,
      "Name": "OnWeaponFired",
      "FullName": "OnWeaponFired",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "baseProjectile",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local3",
          "typeName": "ItemModProjectile",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "ProtoBuf.ProjectileShoot",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a weapon is fired."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\n[BaseEntity.RPC_Server.FromOwner]\nprivate void CLProject(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!VerifyClientAttack(player))\n\t{\n\t\tSendNetworkUpdate();\n\t\treturn;\n\t}\n\tif (reloadFinished && HasReloadCooldown())\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Reloading (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"reload_cooldown\");\n\t\treturn;\n\t}\n\treloadStarted = false;\n\treloadFinished = false;\n\tif (primaryMagazine.contents <= 0 && !base.UsingInfiniteAmmoCheat)\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Project magazine empty (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"magazine_empty_project\");\n\t\treturn;\n\t}\n\tItemDefinition primaryMagazineAmmo = PrimaryMagazineAmmo;\n\tusing ProtoBuf.ProjectileShoot projectileShoot = msg.read.Proto<ProtoBuf.ProjectileShoot>();\n\tif (primaryMagazineAmmo.itemid != projectileShoot.ammoType)\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Ammo mismatch (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"ammo_mismatch\");\n\t\treturn;\n\t}\n\tif (!base.UsingInfiniteAmmoCheat)\n\t{\n\t\tModifyAmmoCount(-1);\n\t}\n\tItemModProjectile component = primaryMagazineAmmo.GetComponent<ItemModProjectile>();\n\tif (component == null)\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Item mod not found (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"mod_missing\");\n\t\treturn;\n\t}\n\tif (projectileShoot.projectiles.Count > component.numProjectiles)\n\t{\n\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, \"Count mismatch (\" + base.ShortPrefabName + \")\");\n\t\tplayer.stats.combat.LogInvalid(player, this, \"count_mismatch\");\n\t\treturn;\n\t}\n\tOxide.Core.Interface.CallHook(\"OnWeaponFired\", this, msg.player, component, projectileShoot);\n\tif (player.InGesture)\n\t{\n\t\treturn;\n\t}\n\tSignalBroadcast(BaseEntity.Signal.Attack, string.Empty, msg.connection, GetAttackEffect(), maxAttackEffectDistance);\n\tplayer.CleanupExpiredProjectiles();\n\tSystem.Guid projectileGroupId = System.Guid.NewGuid();\n\tforeach (ProtoBuf.ProjectileShoot.Projectile projectile in projectileShoot.projectiles)\n\t{\n\t\tif (player.HasFiredProjectile(projectile.projectileID))\n\t\t{\n\t\t\tAntiHack.Log(player, AntiHackType.ProjectileHack, $\"Duplicate ID ({projectile.projectileID})\");\n\t\t\tplayer.stats.combat.LogInvalid(player, this, \"duplicate_id\");\n\t\t\tcontinue;\n\t\t}\n\t\tUnityEngine.Vector3 positionOffset = UnityEngine.Vector3.zero;\n\t\tif (ConVar.AntiHack.projectile_positionoffset && (player.isMounted || player.HasParent()))\n\t\t{\n\t\t\tif (!ValidateEyePos(player, projectile.startPos, checkLineOfSight: false))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tUnityEngine.Vector3 position = player.eyes.position;\n\t\t\tpositionOffset = position - projectile.startPos;\n\t\t\tprojectile.startPos = position;\n\t\t}\n\t\telse if (!ValidateEyePos(player, projectile.startPos))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\tplayer.NoteFiredProjectile(projectile.projectileID, projectile.startPos, projectile.startVel, this, primaryMagazineAmmo, projectileGroupId, positionOffset);\n\t\tif (!player.limitNetworking)\n\t\t{\n\t\t\tCreateProjectileEffectClientside(component.GetOverrideProjectile(this).resourcePath, projectile.startPos, projectile.startVel, projectile.seed, msg.connection, IsSilenced());\n\t\t}\n\t}\n\tplayer.MakeNoise(player.transform.position, BaseCombatEntity.ActionVolume.Loud);\n\tSingletonComponent<Rust.Ai.Gen2.NpcNoiseManager>.Instance.OnWeaponShot(player, this);\n\tplayer.stats.Add(component.category + \"_fired\", projectileShoot.projectiles.Count, (Stats)5);\n\tplayer.LifeStoryShotFired(this);\n\tStartAttackCooldown(ScaleRepeatDelay(repeatDelay) + animationDelay);\n\tplayer.MarkHostileFor();\n\tUpdateItemCondition();\n\tDidAttackServerside();\n\tBaseMountable mounted = player.GetMounted();\n\tif (mounted != null)\n\t{\n\t\tmounted.OnWeaponFired(this);\n\t}\n\tEACServer.LogPlayerUseWeapon(player, this);\n}\n",
      "ParametersText": "BaseProjectile baseProjectile, BasePlayer player, ItemModProjectile local3, ProtoBuf.ProjectileShoot local2",
      "TargetName": "BaseProjectile",
      "MethodName": "CLProject",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3071637698,
      "Name": "OnWeaponReload",
      "FullName": "OnWeaponReload",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "baseProjectile",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a weapon reloads."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void StartReload(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (!VerifyClientRPC(player))\n\t{\n\t\tSendNetworkUpdate();\n\t\treloadStarted = false;\n\t\treloadFinished = false;\n\t}\n\telse if (Oxide.Core.Interface.CallHook(\"OnWeaponReload\", this, player) == null)\n\t{\n\t\treloadFinished = false;\n\t\treloadStarted = true;\n\t\tfractionalInsertCounter = 0;\n\t\tif (CanRefundAmmo)\n\t\t{\n\t\t\tSwitchAmmoTypesIfNeeded(player.inventory);\n\t\t}\n\t\tOnReloadStarted();\n\t\tStartReloadCooldown(GetReloadDuration());\n\t}\n}\n",
      "ParametersText": "BaseProjectile baseProjectile, BasePlayer local0",
      "TargetName": "BaseProjectile",
      "MethodName": "StartReload",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3758289511,
      "Name": "OnAmmoSwitch",
      "FullName": "OnAmmoSwitch",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "baseProjectile",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "ItemDefinition",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when ammo switch occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void SwitchAmmoTo(BaseEntity.RPCMessage msg)\n{\n\tif (!TryGetOwnerPlayer(out var ownerPlayer))\n\t{\n\t\treturn;\n\t}\n\tint num = msg.read.Int32();\n\tif (num == primaryMagazine.ammoType.itemid)\n\t{\n\t\treturn;\n\t}\n\tItemDefinition itemDefinition = ItemManager.FindItemDefinition(num);\n\tif (itemDefinition == null)\n\t{\n\t\treturn;\n\t}\n\tItemModProjectile component = itemDefinition.GetComponent<ItemModProjectile>();\n\tif ((bool)component && component.IsAmmo(primaryMagazine.definition.ammoTypes) && Oxide.Core.Interface.CallHook(\"OnAmmoSwitch\", this, ownerPlayer, itemDefinition) == null)\n\t{\n\t\tif (primaryMagazine.contents > 0)\n\t\t{\n\t\t\townerPlayer.GiveItem(ItemManager.CreateByItemID(primaryMagazine.ammoType.itemid, primaryMagazine.contents, 0uL));\n\t\t\tSetAmmoCount(0);\n\t\t}\n\t\tprimaryMagazine.ammoType = itemDefinition;\n\t\tSendNetworkUpdateImmediate();\n\t\tItemManager.DoRemoves();\n\t\townerPlayer.inventory.ServerUpdate(0f);\n\t}\n}\n",
      "ParametersText": "BaseProjectile baseProjectile, BasePlayer local0, ItemDefinition local2",
      "TargetName": "BaseProjectile",
      "MethodName": "SwitchAmmoTo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4023793289,
      "Name": "OnAmmoUnload",
      "FullName": "OnAmmoUnload",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "item",
          "typeName": "Item",
          "optional": false
        },
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when ammo unload occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void UnloadAmmo(Item item, BasePlayer player)\n{\n\tBaseProjectile component = item.GetHeldEntity().GetComponent<BaseProjectile>();\n\tif (!component.canUnloadAmmo || Oxide.Core.Interface.CallHook(\"OnAmmoUnload\", component, item, player) != null || !component)\n\t{\n\t\treturn;\n\t}\n\tint num = component.primaryMagazine.contents;\n\tif (num <= 0)\n\t{\n\t\treturn;\n\t}\n\tcomponent.SetAmmoCount(0);\n\titem.MarkDirty();\n\tSendNetworkUpdateImmediate();\n\tint stackable = component.primaryMagazine.ammoType.stackable;\n\tif (num > stackable)\n\t{\n\t\tint num2 = UnityEngine.Mathf.FloorToInt(num / component.primaryMagazine.ammoType.stackable);\n\t\tnum %= stackable;\n\t\tfor (int i = 0; i < num2; i++)\n\t\t{\n\t\t\tItem item2 = ItemManager.Create(component.primaryMagazine.ammoType, stackable, 0uL);\n\t\t\tplayer.GiveItem(item2);\n\t\t}\n\t}\n\tif (num > 0)\n\t{\n\t\tItem item3 = ItemManager.Create(component.primaryMagazine.ammoType, num, 0uL);\n\t\tplayer.GiveItem(item3);\n\t}\n}\n",
      "ParametersText": "BaseProjectile local0, Item item, BasePlayer player",
      "TargetName": "BaseProjectile",
      "MethodName": "UnloadAmmo",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3526322469,
      "Name": "OnWeaponModChange",
      "FullName": "OnWeaponModChange",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "baseProjectile",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BaseProjectile",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a weapon mod is changed."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DelayedModsChanged()\n{\n\tif (Oxide.Core.Interface.CallHook(\"OnWeaponModChange\", this, GetOwnerPlayer()) != null)\n\t{\n\t\treturn;\n\t}\n\tint num = UnityEngine.Mathf.CeilToInt(ProjectileWeaponMod.Mult(this, ProjectileWeaponMod.SelectMagCap, ProjectileWeaponMod.SelectScalar) * (float)primaryMagazine.definition.builtInSize);\n\tif (num == primaryMagazine.capacity)\n\t{\n\t\treturn;\n\t}\n\tif (primaryMagazine.contents > 0 && primaryMagazine.contents > num)\n\t{\n\t\t_ = primaryMagazine.ammoType;\n\t\tint contents = primaryMagazine.contents;\n\t\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\t\tItemContainer itemContainer = null;\n\t\tif (ownerPlayer != null)\n\t\t{\n\t\t\titemContainer = ownerPlayer.inventory.containerMain;\n\t\t}\n\t\telse if (GetCachedItem() != null)\n\t\t{\n\t\t\titemContainer = GetCachedItem().parent;\n\t\t}\n\t\tSetAmmoCount(0);\n\t\tif (itemContainer != null)\n\t\t{\n\t\t\tItem item = ItemManager.Create(primaryMagazine.ammoType, contents, 0uL);\n\t\t\tif (!item.MoveToContainer(itemContainer))\n\t\t\t{\n\t\t\t\tUnityEngine.Vector3 vPos = base.transform.position;\n\t\t\t\tif (itemContainer.entityOwner != null)\n\t\t\t\t{\n\t\t\t\t\tvPos = itemContainer.entityOwner.transform.position + UnityEngine.Vector3.up * 0.25f;\n\t\t\t\t}\n\t\t\t\titem.Drop(vPos, UnityEngine.Vector3.up * 5f);\n\t\t\t}\n\t\t}\n\t}\n\tprimaryMagazine.capacity = num;\n\tSendNetworkUpdate();\n}\n",
      "ParametersText": "BaseProjectile baseProjectile, BaseProjectile self1",
      "TargetName": "BaseProjectile",
      "MethodName": "DelayedModsChanged",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2678373223,
      "Name": "OnMagazineReload",
      "FullName": "OnMagazineReload",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "baseProjectile",
          "typeName": "BaseProjectile",
          "optional": false
        },
        {
          "name": "ammoSource",
          "typeName": "IAmmoContainer",
          "optional": false
        },
        {
          "name": "self1",
          "typeName": "BaseProjectile",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a magazine reloads."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool TryReloadMagazine(IAmmoContainer ammoSource, int desiredAmount = -1)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"OnMagazineReload\", this, ammoSource, GetOwnerPlayer());\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (!TryReload(ammoSource, desiredAmount))\n\t{\n\t\treturn false;\n\t}\n\tSendNetworkUpdateImmediate();\n\tItemManager.DoRemoves();\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (ownerPlayer != null)\n\t{\n\t\townerPlayer.inventory.ServerUpdate(0f);\n\t}\n\tif (!fractionalReload)\n\t{\n\t\tUpdateShieldState(bHeld: true);\n\t}\n\telse if (primaryMagazine.contents == primaryMagazine.capacity || !ammoSource.HasAmmo(primaryMagazine.definition.ammoTypes))\n\t{\n\t\tUpdateShieldState(bHeld: true);\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BaseProjectile baseProjectile, IAmmoContainer ammoSource, BaseProjectile self1",
      "TargetName": "BaseProjectile",
      "MethodName": "TryReloadMagazine",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 3284676800,
      "Name": "CanCreateWorldProjectile",
      "FullName": "CanCreateWorldProjectile",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        },
        {
          "name": "itemDef",
          "typeName": "ItemDefinition",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to create world projectile.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected virtual void CreateWorldProjectile(HitInfo info, ItemDefinition itemDef, ItemModProjectile itemMod, Projectile projectilePrefab, Item recycleItem)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanCreateWorldProjectile\", info, itemDef) != null)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 projectileVelocity = info.ProjectileVelocity;\n\tItem item = ((recycleItem != null) ? recycleItem : ItemManager.Create(itemDef, 1, 0uL));\n\tif (Oxide.Core.Interface.CallHook(\"OnWorldProjectileCreate\", info, item) != null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = null;\n\tif (!info.DidHit)\n\t{\n\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\treturn;\n\t}\n\tif (projectilePrefab.breakProbability > 0f && UnityEngine.Random.value <= projectilePrefab.breakProbability)\n\t{\n\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\treturn;\n\t}\n\tif (projectilePrefab.conditionLoss > 0f)\n\t{\n\t\titem.LoseCondition(projectilePrefab.conditionLoss * 100f);\n\t\tif (item.isBroken)\n\t\t{\n\t\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (projectilePrefab.stickProbability > 0f && UnityEngine.Random.value <= projectilePrefab.stickProbability)\n\t{\n\t\tbaseEntity = ((info.HitEntity == null) ? item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized)) : ((info.HitBone != 0) ? item.CreateWorldObject(info.HitPositionLocal, UnityEngine.Quaternion.LookRotation(info.HitNormalLocal * -1f), info.HitEntity, info.HitBone) : item.CreateWorldObject(info.HitPositionLocal, UnityEngine.Quaternion.LookRotation(info.HitEntity.transform.InverseTransformDirection(projectileVelocity.normalized)), info.HitEntity)));\n\t\tDroppedItem droppedItem = baseEntity as DroppedItem;\n\t\tif (droppedItem != null)\n\t\t{\n\t\t\tdroppedItem.StickIn();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbaseEntity.GetComponent<UnityEngine.Rigidbody>().isKinematic = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\tUnityEngine.Rigidbody component = baseEntity.GetComponent<UnityEngine.Rigidbody>();\n\t\tcomponent.AddForce(projectileVelocity.normalized * 200f);\n\t\tcomponent.WakeUp();\n\t}\n}\n",
      "ParametersText": "HitInfo info, ItemDefinition itemDef",
      "TargetName": "BasePlayer",
      "MethodName": "CreateWorldProjectile",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3351436933,
      "Name": "OnWorldProjectileCreate",
      "FullName": "OnWorldProjectileCreate",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "Item",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a world projectile is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "protected virtual void CreateWorldProjectile(HitInfo info, ItemDefinition itemDef, ItemModProjectile itemMod, Projectile projectilePrefab, Item recycleItem)\n{\n\tif (Oxide.Core.Interface.CallHook(\"CanCreateWorldProjectile\", info, itemDef) != null)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 projectileVelocity = info.ProjectileVelocity;\n\tItem item = ((recycleItem != null) ? recycleItem : ItemManager.Create(itemDef, 1, 0uL));\n\tif (Oxide.Core.Interface.CallHook(\"OnWorldProjectileCreate\", info, item) != null)\n\t{\n\t\treturn;\n\t}\n\tBaseEntity baseEntity = null;\n\tif (!info.DidHit)\n\t{\n\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\treturn;\n\t}\n\tif (projectilePrefab.breakProbability > 0f && UnityEngine.Random.value <= projectilePrefab.breakProbability)\n\t{\n\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\treturn;\n\t}\n\tif (projectilePrefab.conditionLoss > 0f)\n\t{\n\t\titem.LoseCondition(projectilePrefab.conditionLoss * 100f);\n\t\tif (item.isBroken)\n\t\t{\n\t\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\t\tbaseEntity.Kill(BaseNetworkable.DestroyMode.Gib);\n\t\t\treturn;\n\t\t}\n\t}\n\tif (projectilePrefab.stickProbability > 0f && UnityEngine.Random.value <= projectilePrefab.stickProbability)\n\t{\n\t\tbaseEntity = ((info.HitEntity == null) ? item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized)) : ((info.HitBone != 0) ? item.CreateWorldObject(info.HitPositionLocal, UnityEngine.Quaternion.LookRotation(info.HitNormalLocal * -1f), info.HitEntity, info.HitBone) : item.CreateWorldObject(info.HitPositionLocal, UnityEngine.Quaternion.LookRotation(info.HitEntity.transform.InverseTransformDirection(projectileVelocity.normalized)), info.HitEntity)));\n\t\tDroppedItem droppedItem = baseEntity as DroppedItem;\n\t\tif (droppedItem != null)\n\t\t{\n\t\t\tdroppedItem.StickIn();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbaseEntity.GetComponent<UnityEngine.Rigidbody>().isKinematic = true;\n\t\t}\n\t}\n\telse\n\t{\n\t\tbaseEntity = item.CreateWorldObject(info.HitPositionWorld, UnityEngine.Quaternion.LookRotation(projectileVelocity.normalized));\n\t\tUnityEngine.Rigidbody component = baseEntity.GetComponent<UnityEngine.Rigidbody>();\n\t\tcomponent.AddForce(projectileVelocity.normalized * 200f);\n\t\tcomponent.WakeUp();\n\t}\n}\n",
      "ParametersText": "HitInfo info, Item local1",
      "TargetName": "BasePlayer",
      "MethodName": "CreateWorldProjectile",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 533818454,
      "Name": "OnProjectileRicochet",
      "FullName": "OnProjectileRicochet",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "basePlayer",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "ProtoBuf.PlayerProjectileRicochet",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when projectile ricochet occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.FromOwner]\npublic void OnProjectileRicochet(BaseEntity.RPCMessage msg)\n{\n\tusing ProtoBuf.PlayerProjectileRicochet playerProjectileRicochet = msg.read.Proto<ProtoBuf.PlayerProjectileRicochet>();\n\tif (playerProjectileRicochet != null)\n\t{\n\t\tBasePlayer.FiredProjectile value;\n\t\tif (UnityEngine.Vector3Ex.IsNaNOrInfinity(playerProjectileRicochet.hitPosition) || UnityEngine.Vector3Ex.IsNaNOrInfinity(playerProjectileRicochet.inVelocity) || UnityEngine.Vector3Ex.IsNaNOrInfinity(playerProjectileRicochet.outVelocity) || UnityEngine.Vector3Ex.IsNaNOrInfinity(playerProjectileRicochet.hitNormal) || float.IsNaN(playerProjectileRicochet.travelTime) || float.IsInfinity(playerProjectileRicochet.travelTime))\n\t\t{\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Contains NaN ({playerProjectileRicochet.projectileID})\");\n\t\t}\n\t\telse if (!firedProjectiles.TryGetValue(playerProjectileRicochet.projectileID, out value))\n\t\t{\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Missing ID ({playerProjectileRicochet.projectileID})\", logToAnalytics: false);\n\t\t}\n\t\telse if (value.firedTime < UnityEngine.Time.realtimeSinceStartup - 8f)\n\t\t{\n\t\t\tAntiHack.Log(this, AntiHackType.ProjectileHack, $\"Lifetime is zero ({playerProjectileRicochet.projectileID})\");\n\t\t}\n\t\telse if (Oxide.Core.Interface.CallHook(\"OnProjectileRicochet\", this, playerProjectileRicochet) == null)\n\t\t{\n\t\t\tvalue.ricochets++;\n\t\t\tfiredProjectiles[playerProjectileRicochet.projectileID] = value;\n\t\t}\n\t}\n}\n",
      "ParametersText": "BasePlayer basePlayer, ProtoBuf.PlayerProjectileRicochet local0",
      "TargetName": "BasePlayer",
      "MethodName": "OnProjectileRicochet",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 637528194,
      "Name": "OnFlameThrowerBurn",
      "FullName": "OnFlameThrowerBurn",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "flameThrower",
          "typeName": "FlameThrower",
          "optional": false
        },
        {
          "name": "local13",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when flame thrower burn occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FlameTick()\n{\n\tfloat num = UnityEngine.Time.realtimeSinceStartup - lastFlameTick;\n\tlastFlameTick = UnityEngine.Time.realtimeSinceStartup;\n\tBasePlayer ownerPlayer = GetOwnerPlayer();\n\tif (!ownerPlayer)\n\t{\n\t\treturn;\n\t}\n\tSingletonComponent<NpcFireManager>.Instance.Move(this);\n\tReduceAmmo(num);\n\tSendNetworkUpdate();\n\tUnityEngine.Ray ray = ownerPlayer.eyes.BodyRay();\n\tUnityEngine.Vector3 origin = ray.origin;\n\tUnityEngine.RaycastHit hitInfo;\n\tbool num2 = UnityEngine.Physics.SphereCast(ray, 0.3f, out hitInfo, flameRange, 1218652417);\n\tif (!num2)\n\t{\n\t\thitInfo.point = origin + ray.direction * flameRange;\n\t}\n\tfloat num3 = (ownerPlayer.IsNpc ? npcDamageScale : 1f);\n\tfloat amount = damagePerSec[0].amount;\n\tdamagePerSec[0].amount = amount * num * num3;\n\tint num4 = 2146305;\n\tint layers = 133376;\n\tif (!ownerPlayer.IsNpc)\n\t{\n\t\tnum4 |= 0x800;\n\t}\n\tDamageUtil.RadiusDamage(ownerPlayer, LookupPrefab(), hitInfo.point - ray.direction * 0.1f, flameRadius * 0.5f, flameRadius, damagePerSec, num4, useLineOfSight: true, ignoreAI: false, ignoreAttackingPlayer: true, extendedLineOfSight: true);\n\tdamagePerSec[0].amount = damagePerSec[0].amount * playerDamageMultiplier;\n\tDamageUtil.RadiusDamage(ownerPlayer, LookupPrefab(), hitInfo.point - ray.direction * 0.1f, flameRadius * 0.5f, flameRadius, damagePerSec, layers, useLineOfSight: true, ignoreAI: false, ignoreAttackingPlayer: true, extendedLineOfSight: true);\n\tdamagePerSec[0].amount = amount;\n\tif (num2 && UnityEngine.Time.realtimeSinceStartup >= nextFlameTime && hitInfo.distance > 1.1f)\n\t{\n\t\tnextFlameTime = UnityEngine.Time.realtimeSinceStartup + (ownerPlayer.IsNpc ? 0.25f : 0.45f);\n\t\tUnityEngine.Vector3 vector = hitInfo.point - ray.direction * 0.25f;\n\t\tUnityEngine.Vector3 vector2 = vector + new UnityEngine.Vector3(0f, 0.2f, 0f);\n\t\tbool flag = !GamePhysics.CheckSphere(vector, 0.1f, 1084293377);\n\t\tif (!flag && GamePhysics.LineOfSight(vector, vector2, 1084293377))\n\t\t{\n\t\t\tvector = vector2;\n\t\t\tflag = !GamePhysics.CheckSphere(vector, 0.1f, 1084293377);\n\t\t}\n\t\tif (flag)\n\t\t{\n\t\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(fireballPrefab.resourcePath, vector);\n\t\t\tif ((bool)baseEntity)\n\t\t\t{\n\t\t\t\tbaseEntity.creatorEntity = ownerPlayer;\n\t\t\t\tOxide.Core.Interface.CallHook(\"OnFlameThrowerBurn\", this, baseEntity);\n\t\t\t\tFireBall fireBall = baseEntity as FireBall;\n\t\t\t\tif (fireBall != null && ownerPlayer.IsNpc)\n\t\t\t\t{\n\t\t\t\t\tfireBall.ignoreNPC = true;\n\t\t\t\t}\n\t\t\t\tbaseEntity.Spawn();\n\t\t\t}\n\t\t}\n\t}\n\tif (ammo == 0)\n\t{\n\t\tSetFlameState(wantsOn: false);\n\t}\n\tItem ownerItem = GetOwnerItem();\n\tif (ownerItem != null && !base.UsingInfiniteAmmoCheat && !ownerPlayer.IsNpc)\n\t{\n\t\townerItem.LoseCondition(num);\n\t}\n}\n",
      "ParametersText": "FlameThrower flameThrower, BaseEntity local13",
      "TargetName": "FlameThrower",
      "MethodName": "FlameTick",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2923636840,
      "Name": "OnFireBallDamage",
      "FullName": "OnFireBallDamage",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "fireBall",
          "typeName": "FireBall",
          "optional": false
        },
        {
          "name": "local4",
          "typeName": "BaseCombatEntity",
          "optional": false
        },
        {
          "name": "local2",
          "typeName": "HitInfo",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a fire ball is damaged."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void DoRadialDamage()\n{\n\tSystem.Collections.Generic.List<BaseCombatEntity> obj = Facepunch.Pool.Get<System.Collections.Generic.List<BaseCombatEntity>>();\n\tUnityEngine.Vector3 position = base.transform.position + new UnityEngine.Vector3(0f, radius * 0.75f, 0f);\n\tVis.Entities(position, radius, obj, AttackLayers, UnityEngine.QueryTriggerInteraction.Ignore);\n\tHitInfo hitInfo = new HitInfo();\n\thitInfo.DoHitEffects = true;\n\thitInfo.DidHit = true;\n\thitInfo.HitBone = 0u;\n\thitInfo.Initiator = ((creatorEntity == null) ? UnityEngine.GameObjectEx.ToBaseEntity(base.gameObject) : creatorEntity);\n\thitInfo.PointStart = base.transform.position;\n\tforeach (BaseCombatEntity item in obj)\n\t{\n\t\tif (!(item == null) && item.isServer && item.IsAlive() && (!ignoreNPC || !item.IsNpc) && item.IsVisible(position))\n\t\t{\n\t\t\tif (item is BasePlayer)\n\t\t\t{\n\t\t\t\tEffect.server.Run(\"assets/bundled/prefabs/fx/impacts/additive/fire.prefab\", item, 0u, new UnityEngine.Vector3(0f, 1f, 0f), UnityEngine.Vector3.up);\n\t\t\t}\n\t\t\thitInfo.PointEnd = item.transform.position;\n\t\t\thitInfo.HitPositionWorld = item.transform.position;\n\t\t\thitInfo.damageTypes.Set(Rust.DamageType.Heat, damagePerSecond * tickRate);\n\t\t\tOxide.Core.Interface.CallHook(\"OnFireBallDamage\", this, item, hitInfo);\n\t\t\titem.OnAttacked(hitInfo);\n\t\t}\n\t}\n\tFacepunch.Pool.FreeUnmanaged(ref obj);\n}\n",
      "ParametersText": "FireBall fireBall, BaseCombatEntity local4, HitInfo local2",
      "TargetName": "FireBall",
      "MethodName": "DoRadialDamage",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3023622882,
      "Name": "OnFireBallSpread",
      "FullName": "OnFireBallSpread",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "fireBall",
          "typeName": "FireBall",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "BaseEntity",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when fire ball spread occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void TryToSpread()\n{\n\tfloat num = 0.9f - generation * 0.1f;\n\tif (UnityEngine.Random.Range(0f, 1f) < num && spreadSubEntity.isValid)\n\t{\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(spreadSubEntity.resourcePath);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tbaseEntity.transform.position = base.transform.position + UnityEngine.Vector3.up * 0.25f;\n\t\t\tbaseEntity.Spawn();\n\t\t\tUnityEngine.Vector3 modifiedAimConeDirection = AimConeUtil.GetModifiedAimConeDirection(45f, UnityEngine.Vector3.up);\n\t\t\tbaseEntity.creatorEntity = ((creatorEntity == null) ? baseEntity : creatorEntity);\n\t\t\tOxide.Core.Interface.CallHook(\"OnFireBallSpread\", this, baseEntity);\n\t\t\tbaseEntity.SetVelocity(modifiedAimConeDirection * UnityEngine.Random.Range(5f, 8f));\n\t\t\tbaseEntity.SendMessage(\"SetGeneration\", generation + 1f);\n\t\t}\n\t}\n}\n",
      "ParametersText": "FireBall fireBall, BaseEntity local1",
      "TargetName": "FireBall",
      "MethodName": "TryToSpread",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 1897039526,
      "Name": "OnExplosiveFuseSet",
      "FullName": "OnExplosiveFuseSet",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "timedExplosive",
          "typeName": "TimedExplosive",
          "optional": false
        },
        {
          "name": "fuseLength",
          "typeName": "System.Single",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when explosive fuse set occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void SetFuse(float fuseLength)\n{\n\tif (base.isServer)\n\t{\n\t\tobject obj = Oxide.Core.Interface.CallHook(\"OnExplosiveFuseSet\", this, fuseLength);\n\t\tif (obj is float)\n\t\t{\n\t\t\tfuseLength = (float)obj;\n\t\t}\n\t\tInvoke(Explode, fuseLength);\n\t\tSetFlag(BaseEntity.Flags.Reserved2, b: true);\n\t}\n}\n",
      "ParametersText": "TimedExplosive timedExplosive, float fuseLength",
      "TargetName": "TimedExplosive",
      "MethodName": "SetFuse",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4130217545,
      "Name": "OnTimedExplosiveExplode",
      "FullName": "OnTimedExplosiveExplode",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "timedExplosive",
          "typeName": "TimedExplosive",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a timed explosive explodes."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual void Explode()\n{\n\tExplode(PivotPoint());\n}\n",
      "ParametersText": "TimedExplosive timedExplosive",
      "TargetName": "TimedExplosive",
      "MethodName": "Explode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 514808608,
      "Name": "OnFlameExplosion",
      "FullName": "OnFlameExplosion",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "flameExplosive",
          "typeName": "FlameExplosive",
          "optional": false
        },
        {
          "name": "local1",
          "typeName": "UnityEngine.Collider",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when flame explosion occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void FlameExplode(UnityEngine.Vector3 surfaceNormal)\n{\n\tif (!base.isServer)\n\t{\n\t\treturn;\n\t}\n\tUnityEngine.Vector3 position = base.transform.position;\n\tif (blockCreateUnderwater && WaterLevel.Test(position, waves: true, volumes: false))\n\t{\n\t\tbase.Explode();\n\t\treturn;\n\t}\n\tUnityEngine.Collider component = GetComponent<UnityEngine.Collider>();\n\tif ((bool)component)\n\t{\n\t\tcomponent.enabled = false;\n\t}\n\tfor (int i = 0; (float)i < numToCreate; i++)\n\t{\n\t\tBaseEntity baseEntity = GameManager.server.CreateEntity(createOnExplode.resourcePath, position);\n\t\tif ((bool)baseEntity)\n\t\t{\n\t\t\tfloat num = (float)i / numToCreate;\n\t\t\tUnityEngine.Vector3 modifiedAimConeDirection = AimConeUtil.GetModifiedAimConeDirection(spreadAngle * spreadCurve.Evaluate(num), surfaceNormal);\n\t\t\tfloat y = UnityEngine.Random.Range(0f, 360f);\n\t\t\tUnityEngine.Quaternion rotation = UnityEngine.Quaternion.Euler(0f, y, 0f);\n\t\t\tbaseEntity.transform.SetPositionAndRotation(position, rotation);\n\t\t\tbaseEntity.creatorEntity = ((creatorEntity == null) ? baseEntity : creatorEntity);\n\t\t\tbaseEntity.Spawn();\n\t\t\tOxide.Core.Interface.CallHook(\"OnFlameExplosion\", this, component);\n\t\t\tUnityEngine.Vector3 vector = modifiedAimConeDirection.normalized * UnityEngine.Random.Range(minVelocity, maxVelocity) * velocityCurve.Evaluate(num * UnityEngine.Random.Range(1f, 1.1f));\n\t\t\tFireBall component2 = baseEntity.GetComponent<FireBall>();\n\t\t\tif (component2 != null)\n\t\t\t{\n\t\t\t\tcomponent2.SetDelayedVelocity(vector);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tbaseEntity.SetVelocity(vector);\n\t\t\t}\n\t\t}\n\t}\n\tbase.Explode();\n}\n",
      "ParametersText": "FlameExplosive flameExplosive, UnityEngine.Collider local1",
      "TargetName": "FlameExplosive",
      "MethodName": "FlameExplode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 880112741,
      "Name": "OnImpactEffectCreate",
      "FullName": "OnImpactEffectCreate",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "info",
          "typeName": "HitInfo",
          "optional": false
        },
        {
          "name": "customEffect",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when an impact effect is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "",
      "ParametersText": "HitInfo info, string customEffect",
      "TargetName": "Effect/server",
      "MethodName": "ImpactEffect",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2687303864,
      "Name": "CanFireLiquidWeapon",
      "FullName": "CanFireLiquidWeapon",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "player",
          "typeName": "BasePlayer",
          "optional": false
        },
        {
          "name": "liquidWeapon",
          "typeName": "LiquidWeapon",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether to fire liquid weapon.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private bool CanFire(BasePlayer player)\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanFireLiquidWeapon\", player, this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\tif (RequiresPumping && pressure < PressureLossPerTick)\n\t{\n\t\treturn false;\n\t}\n\tif (player == null)\n\t{\n\t\treturn false;\n\t}\n\tif (HasFlag(BaseEntity.Flags.Open))\n\t{\n\t\treturn false;\n\t}\n\tif (AmountHeld() <= 0)\n\t{\n\t\treturn false;\n\t}\n\tif (!player.CanInteract())\n\t{\n\t\treturn false;\n\t}\n\tif (!player.CanAttack() || player.IsRunning())\n\t{\n\t\treturn false;\n\t}\n\tItem item = GetItem();\n\tif (item == null || item.contents == null)\n\t{\n\t\treturn false;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BasePlayer player, LiquidWeapon liquidWeapon",
      "TargetName": "LiquidWeapon",
      "MethodName": "CanFire",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 266948780,
      "Name": "OnLiquidWeaponFired",
      "FullName": "OnLiquidWeaponFired",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "liquidWeapon",
          "typeName": "LiquidWeapon",
          "optional": false
        },
        {
          "name": "local0",
          "typeName": "BasePlayer",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a liquid weapon is fired."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void StartFiring(BaseEntity.RPCMessage msg)\n{\n\tBasePlayer player = msg.player;\n\tif (OnCooldown())\n\t{\n\t\treturn;\n\t}\n\tif (!RequiresPumping)\n\t{\n\t\tpressure = MaxPressure;\n\t}\n\tif (CanFire(player))\n\t{\n\t\tCancelInvoke(FireTick);\n\t\tInvokeRepeating(FireTick, 0f, FireRate);\n\t\tSetFlag(BaseEntity.Flags.On, b: true);\n\t\tStartCooldown(FireRate);\n\t\tif (base.isServer)\n\t\t{\n\t\t\tSendNetworkUpdateImmediate();\n\t\t}\n\t\tOxide.Core.Interface.CallHook(\"OnLiquidWeaponFired\", this, player);\n\t}\n}\n",
      "ParametersText": "LiquidWeapon liquidWeapon, BasePlayer local0",
      "TargetName": "LiquidWeapon",
      "MethodName": "StartFiring",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 3163317821,
      "Name": "OnLiquidWeaponFiringStopped",
      "FullName": "OnLiquidWeaponFiringStopped",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "liquidWeapon",
          "typeName": "LiquidWeapon",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a liquid weapon firing stops."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "[BaseEntity.RPC_Server]\n[BaseEntity.RPC_Server.IsActiveItem]\nprivate void StopFiring()\n{\n\tCancelInvoke(FireTick);\n\tif (!RequiresPumping)\n\t{\n\t\tpressure = MaxPressure;\n\t}\n\tSetFlag(BaseEntity.Flags.On, b: false);\n\tif (base.isServer)\n\t{\n\t\tSendNetworkUpdateImmediate();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnLiquidWeaponFiringStopped\", this);\n}\n",
      "ParametersText": "LiquidWeapon liquidWeapon",
      "TargetName": "LiquidWeapon",
      "MethodName": "StopFiring",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2394657892,
      "Name": "CanBeHomingTargeted",
      "FullName": "CanBeHomingTargeted [BaseHelicopter]",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "baseHelicopter",
          "typeName": "BaseHelicopter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be homing is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public virtual bool IsValidHomingTarget()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeHomingTargeted\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "BaseHelicopter baseHelicopter",
      "TargetName": "BaseHelicopter",
      "MethodName": "IsValidHomingTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2394657892,
      "Name": "CanBeHomingTargeted",
      "FullName": "CanBeHomingTargeted [CH47Helicopter]",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "cH47Helicopter",
          "typeName": "CH47Helicopter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be homing is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool IsValidHomingTarget()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeHomingTargeted\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn false;\n}\n",
      "ParametersText": "CH47Helicopter cH47Helicopter",
      "TargetName": "CH47Helicopter",
      "MethodName": "IsValidHomingTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2394657892,
      "Name": "CanBeHomingTargeted",
      "FullName": "CanBeHomingTargeted [PlayerHelicopter]",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "playerHelicopter",
          "typeName": "PlayerHelicopter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be homing is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override bool IsValidHomingTarget()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeHomingTargeted\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn IsOn();\n}\n",
      "ParametersText": "PlayerHelicopter playerHelicopter",
      "TargetName": "PlayerHelicopter",
      "MethodName": "IsValidHomingTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2394657892,
      "Name": "CanBeHomingTargeted",
      "FullName": "CanBeHomingTargeted [PatrolHelicopter]",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "patrolHelicopter",
          "typeName": "PatrolHelicopter",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be homing is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool IsValidHomingTarget()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeHomingTargeted\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "PatrolHelicopter patrolHelicopter",
      "TargetName": "PatrolHelicopter",
      "MethodName": "IsValidHomingTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 2394657892,
      "Name": "CanBeHomingTargeted",
      "FullName": "CanBeHomingTargeted [HeliPilotFlare]",
      "Category": "Weapon",
      "Parameters": [
        {
          "name": "heliPilotFlare",
          "typeName": "HeliPilotFlare",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called to determine whether the entity can be homing is targeted.",
        "Return true to allow the action and false to block it."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public bool IsValidHomingTarget()\n{\n\tobject obj = Oxide.Core.Interface.CallHook(\"CanBeHomingTargeted\", this);\n\tif (obj is bool)\n\t{\n\t\treturn (bool)obj;\n\t}\n\treturn true;\n}\n",
      "ParametersText": "HeliPilotFlare heliPilotFlare",
      "TargetName": "HeliPilotFlare",
      "MethodName": "IsValidHomingTarget",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "bool"
    },
    {
      "Id": 4003163908,
      "Name": "OnExplosiveDud",
      "FullName": "OnExplosiveDud",
      "Category": "Weapon",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when explosive dud occurs."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public override void Explode()\n{\n\tif (creatorEntity != null && creatorEntity.IsNpc)\n\t{\n\t\tbase.Explode();\n\t}\n\telse if (UnityEngine.Random.Range(0f, 1f) < dudChance && Oxide.Core.Interface.CallHook(\"OnExplosiveDud\", this) == null)\n\t{\n\t\tBecomeDud();\n\t}\n\telse\n\t{\n\t\tbase.Explode();\n\t}\n}\n",
      "ParametersText": "",
      "TargetName": "DudTimedExplosive",
      "MethodName": "Explode",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ],
  "World": [
    {
      "Id": 3311380936,
      "Name": "OnTerrainInitialized",
      "FullName": "OnTerrainInitialized",
      "Category": "World",
      "Parameters": [],
      "Flags": 0,
      "Descriptions": [
        "Called when a terrAIn is initialized."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public void PostSetupComponents()\n{\n\tTerrainExtension[] components = GetComponents<TerrainExtension>();\n\tfor (int i = 0; i < components.Length; i++)\n\t{\n\t\tcomponents[i].PostSetup();\n\t}\n\tOxide.Core.Interface.CallHook(\"OnTerrainInitialized\");\n}\n",
      "ParametersText": "",
      "TargetName": "TerrainMeta",
      "MethodName": "PostSetupComponents",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 4038213310,
      "Name": "OnWorldPrefabSpawned",
      "FullName": "OnWorldPrefabSpawned",
      "Category": "World",
      "Parameters": [
        {
          "name": "local0",
          "typeName": "UnityEngine.GameObject",
          "optional": false
        },
        {
          "name": "category",
          "typeName": "System.String",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a world prefab is spawned."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "private static void SpawnPrefab(string category, Prefab prefab, UnityEngine.Vector3 position, UnityEngine.Quaternion rotation, UnityEngine.Vector3 scale)\n{\n\tif (prefab != null && (bool)prefab.Object)\n\t{\n\t\tspawnTimer.Restart();\n\t\tif (!Cached)\n\t\t{\n\t\t\tprefab.ApplyTerrainPlacements(position, rotation, scale);\n\t\t\tprefab.ApplyTerrainModifiers(position, rotation, scale);\n\t\t}\n\t\tUnityEngine.GameObject gameObject = prefab.Spawn(position, rotation, scale);\n\t\tTrackSpawnedPrefab(category, gameObject);\n\t\tOxide.Core.Interface.CallHook(\"OnWorldPrefabSpawned\", gameObject, category);\n\t\tspawnTimer.Stop();\n\t\tspawnTimings.Add(new World.SpawnTiming\n\t\t{\n\t\t\tcategory = category,\n\t\t\tprefab = prefab,\n\t\t\tposition = position,\n\t\t\trotation = rotation,\n\t\t\tscale = scale,\n\t\t\ttime = spawnTimer.Elapsed\n\t\t});\n\t}\n}\n",
      "ParametersText": "UnityEngine.GameObject local0, string category",
      "TargetName": "World",
      "MethodName": "SpawnPrefab",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    },
    {
      "Id": 2831125932,
      "Name": "OnTerrainCreate",
      "FullName": "OnTerrainCreate",
      "Category": "World",
      "Parameters": [
        {
          "name": "terrainGenerator",
          "typeName": "TerrainGenerator",
          "optional": false
        }
      ],
      "Flags": 0,
      "Descriptions": [
        "Called when a terrAIn is created."
      ],
      "CarbonCompatible": true,
      "OxideCompatible": true,
      "MethodSource": "public UnityEngine.GameObject CreateTerrain()\n{\n\treturn CreateTerrain(GetHeightMapRes(), GetSplatMapRes());\n}\n",
      "ParametersText": "TerrainGenerator terrainGenerator",
      "TargetName": "TerrainGenerator",
      "MethodName": "CreateTerrain",
      "AssemblyName": "Assembly-CSharp",
      "ReturnTypeName": "void"
    }
  ]
}