C#:
// Copyright © 2023 Tryware OÜ. All rights reserved.
using System;
using System.Collections.Generic;
using CompanionServer.Handlers;
using Newtonsoft.Json;
using Oxide.Core;
using UnityEngine;
namespace Oxide.Plugins {
[Info("Instant Barrel", "Tryhard", "1.3.2")]
[Description("Makes barrels and road signs 1 hp and instantly spawns loot in player inventory")]
public class InstantBarrel : RustPlugin {
private const string onPermission = "instantbarrel.on";
private object boxedFalse = false;
private readonly HashSet<string> lootBarrelsNames = new() {
"loot_barrel_1", "loot_barrel_2", "loot-barrel-1", "loot-barrel-2", "oil_barrel", "roadsign1", "roadsign2", "roadsign3", "roadsign4", "roadsign5", "roadsign6", "roadsign7", "roadsign8", "roadsign9"
}
;
private void OnServerInitialized() => permission.RegisterPermission(onPermission, this);
private object OnEntityTakeDamage(LootContainer lootContainer, HitInfo hitInfo) {
if (lootContainer == null) return null;
if (lootContainer.IsDestroyed) return boxedFalse;
if (hitInfo == null || hitInfo.Initiator == null) return null;
if (hitInfo.ProjectileDistance > config.maxDistance) return null;
if (!config.oneShot && hitInfo.damageTypes.Total() < lootContainer.health) return null;
var lootContainerName = lootContainer.ShortPrefabName;
if (!lootBarrelsNames.Contains(lootContainerName)) return null;
var player = lootContainer.lastAttacker as BasePlayer ?? hitInfo.InitiatorPlayer;
if (player == null || !permission.UserHasPermission(player.UserIDString, onPermission)) return null;
var itemContainer = lootContainer?.inventory;
if (itemContainer == null) return null;
if ((player.transform.position - lootContainer.transform.position).magnitude > config.maxDistance) return null;
if (!config.eWeapon && hitInfo.IsProjectile()) return null;
for (int i = itemContainer.itemList.Count - 1; i >= 0; i--) {
var item = itemContainer.itemList[i];
if (item == null) continue;
if (item.info.itemid == -932201673) {
// Yoinked from game files for scrap tea modifiers | LootContainer_DropBonusItems
float num = (player.modifiers != null) ? (1f + player.modifiers.GetValue(Modifier.ModifierType.Scrap_Yield, 0f)) : 0f;
if (num > 1f) {
float num2 = player.modifiers.GetVariableValue(Modifier.ModifierType.Scrap_Yield, 0f);
float num3 = Mathf.Max((float)lootContainer.scrapAmount * num - (float)lootContainer.scrapAmount, 0f);
num2 += num3;
int num4 = 0;
if (num2 >= 1f) {
num4 = (int)num2;
num2 -= (float)num4;
}
player.modifiers.SetVariableValue(Modifier.ModifierType.Scrap_Yield, num2);
if (num4 > 0) {
item.amount += num4;
}
}
}
player.GiveItem(item, BaseEntity.GiveItemReason.PickedUp);
}
DestroyBarrel(lootContainer, hitInfo);
return boxedFalse;
}
private void DestroyBarrel(LootContainer lootContainer, HitInfo hitInfo) {
if (lootContainer != null && !lootContainer.IsDestroyed) {
Interface.CallHook("OnEntityDeath", lootContainer, hitInfo);
if (config.gibs) {
lootContainer.Kill(BaseNetworkable.DestroyMode.Gib);
}
else {
lootContainer.Kill(BaseNetworkable.DestroyMode.None);
}
}
}
#region Config
static Configuration config;
public class Configuration {
[JsonProperty("Enable farming with weapons")]
public bool eWeapon = true;
[JsonProperty("Max farming distance")]
public float maxDistance = 3f;
[JsonProperty("Make barrels 1 hit to kill")]
public bool oneShot = true;
[JsonProperty("Enable barrel gibs")]
public bool gibs = true;
}
protected override void LoadConfig() {
base.LoadConfig();
try {
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
SaveConfig();
}
catch (Exception e) {
Debug.LogException(e);
PrintWarning("Creating new config file.");
LoadDefaultConfig();
}
}
protected override void LoadDefaultConfig() => config = new Configuration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
}
}