C#:
using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using Newtonsoft.Json;
namespace Oxide.Plugins
{
[Info("OG Barrels", "Ridamees", "1.0.0")]
class OGBarrels : RustPlugin
{
private class RewardItem
{
[JsonProperty("shortname")]
public string Shortname { get; set; }
[JsonProperty("min")]
public int MinAmount { get; set; } = 1;
[JsonProperty("max")]
public int MaxAmount { get; set; } = 1;
[JsonProperty("drop chance")]
public float Chance { get; set; } = 0.75f;
[JsonProperty("drop as bp chance")]
public float BPChance { get; set; }
}
private class Configuration
{
[JsonProperty("Barrel shortnames")]
public List<string> ValidBarrelShortnames { get; set; }
[JsonProperty("Items drop amount")]
public MinMaxConfig ItemsToSelectAtOnce { get; set; } = new MinMaxConfig();
[JsonProperty("LootTable")]
public List<RewardItem> RewardItems { get; set; }
}
public class MinMaxConfig
{
[JsonProperty("min")]
public int MinAmount { get; set; } = 1;
[JsonProperty("max")]
public int MaxAmount { get; set; } = 3;
}
private Configuration config;
private void OnServerInitialized()
{
LoadConfig();
permission.RegisterPermission("ogbarrels.use", this);
Subscribe(nameof(OnEntityDeath));
}
private void OnEntityDeath(BaseEntity entity, HitInfo hitInfo)
{
if (entity != null && config.ValidBarrelShortnames.Contains(entity.ShortPrefabName) && hitInfo != null && hitInfo.InitiatorPlayer != null)
{
BasePlayer initiator = hitInfo.InitiatorPlayer;
if (permission.UserHasPermission(initiator.UserIDString, "ogbarrels.use"))
{
SpawnRewardItems(entity.transform.position);
}
}
}
private void LoadConfig()
{
try
{
config = Config.ReadObject<Configuration>();
}
catch
{
Puts("Creating default configuration...");
LoadDefaultConfig();
}
if (config == null || config.RewardItems == null || config.RewardItems.Count == 0)
{
LoadDefaultConfig();
}
if (config.ValidBarrelShortnames == null || config.ValidBarrelShortnames.Count == 0)
{
config.ValidBarrelShortnames = new List<string>
{
"loot-barrel-1",
"loot-barrel-2",
"loot_barrel_1",
"loot_barrel_2"
};
}
SaveConfig();
}
private void SaveConfig()
{
Config.WriteObject(config, true);
}
private RewardItem SelectRandomItem()
{
List<RewardItem> possibleItems = new List<RewardItem>();
foreach (var rewardItem in config.RewardItems)
{
if (Random.Range(0f, 1f) <= rewardItem.Chance)
{
possibleItems.Add(rewardItem);
}
}
if (possibleItems.Count > 0)
{
int selectedIndex = Random.Range(0, possibleItems.Count);
RewardItem selectedItem = possibleItems[selectedIndex];
if (selectedItem.BPChance > 0.0f)
{
float bpRoll = Random.Range(0f, 1f);
if (bpRoll <= selectedItem.BPChance)
{
return selectedItem;
}
else
{
return selectedItem;
}
}
else
{
return selectedItem;
}
}
return null;
}
private void SpawnRewardItems(Vector3 position)
{
List<RewardItem> selectedItems = new List<RewardItem>();
int itemCount = UnityEngine.Random.Range(config.ItemsToSelectAtOnce.MinAmount, config.ItemsToSelectAtOnce.MaxAmount + 1);
while (selectedItems.Count < itemCount)
{
RewardItem selectedItem = SelectRandomItem();
if (selectedItem != null)
{
selectedItems.Add(selectedItem);
}
}
foreach (var selectedItem in selectedItems)
{
Vector3 spawnPosition = position + new Vector3(Random.Range(-0.2f, 0.2f), 0.8f, Random.Range(-0.2f, 0.2f));
SpawnRewardItem(spawnPosition, selectedItem);
}
}
private void SpawnRewardItem(Vector3 position, RewardItem rewardItem)
{
ItemDefinition itemDef = ItemManager.FindItemDefinition(rewardItem.Shortname);
if (itemDef == null)
return;
int amount = Random.Range(rewardItem.MinAmount, rewardItem.MaxAmount + 1);
if (Random.Range(0f, 1f) <= rewardItem.BPChance && itemDef.Blueprint != null && itemDef.Blueprint.isResearchable)
{
var blueprintBaseDef = ItemManager.FindItemDefinition("blueprintbase");
if (blueprintBaseDef != null)
{
Item blueprintItem = ItemManager.Create(blueprintBaseDef, 1, 0uL);
if (blueprintItem != null)
{
blueprintItem.blueprintTarget = itemDef.itemid;
blueprintItem.Drop(position, Vector3.zero);
}
else
{
Debug.LogError("Failed to create blueprint item for: " + rewardItem.Shortname);
}
}
else
{
Debug.LogError("Blueprint base definition not found.");
}
}
else
{
Item item = ItemManager.Create(itemDef, amount);
if (item != null)
{
item.Drop(position, Vector3.zero);
}
}
}
private void LoadDefaultConfig()
{
config = new Configuration
{
RewardItems = new List<RewardItem>
{
new RewardItem { Shortname = "rifle.ak", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "ammo.pistol", MinAmount = 1, MaxAmount = 20},
new RewardItem { Shortname = "ammo.pistol.fire", MinAmount = 1, MaxAmount = 20},
new RewardItem { Shortname = "ammo.pistol.hv", MinAmount = 1, MaxAmount = 20},
new RewardItem { Shortname = "ammo.rifle", MinAmount = 1, MaxAmount = 30},
new RewardItem { Shortname = "ammo.rifle.explosive", MinAmount = 1, MaxAmount = 30},
new RewardItem { Shortname = "ammo.rifle.incendiary", MinAmount = 1, MaxAmount = 30},
new RewardItem { Shortname = "ammo.rifle.hv", MinAmount = 1, MaxAmount = 30},
new RewardItem { Shortname = "ammo.rocket.basic", MinAmount = 1, MaxAmount = 2, Chance = 0.25f},
new RewardItem { Shortname = "ammo.rocket.hv", MinAmount = 1, MaxAmount = 2, Chance = 0.25f},
new RewardItem { Shortname = "ammo.shotgun", MinAmount = 1, MaxAmount = 15},
new RewardItem { Shortname = "ammo.shotgun.slug", MinAmount = 1, MaxAmount = 15},
new RewardItem { Shortname = "antiradpills", MinAmount = 1, MaxAmount = 5},
new RewardItem { Shortname = "apple"},
new RewardItem { Shortname = "apple.spoiled"},
new RewardItem { Shortname = "arrow.hv", MinAmount = 1, MaxAmount = 5},
new RewardItem { Shortname = "axe.salvaged"},
new RewardItem { Shortname = "barricade.concrete"},
new RewardItem { Shortname = "barricade.metal"},
new RewardItem { Shortname = "barricade.sandbags"},
new RewardItem { Shortname = "barricade.stone"},
new RewardItem { Shortname = "barricade.woodwire"},
new RewardItem { Shortname = "trap.bear"},
new RewardItem { Shortname = "bed"},
new RewardItem { Shortname = "black.raspberries"},
new RewardItem { Shortname = "blueberries", MinAmount = 1, MaxAmount = 5},
new RewardItem { Shortname = "rifle.bolt", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "bone.armor.jacket"},
new RewardItem { Shortname = "bone.armor.pants"},
new RewardItem { Shortname = "bone.fragments"},
new RewardItem { Shortname = "box.wooden.large"},
new RewardItem { Shortname = "bucket.water"},
new RewardItem { Shortname = "bucket.helmet"},
new RewardItem { Shortname = "burlap.gloves"},
new RewardItem { Shortname = "tool.camera"},
new RewardItem { Shortname = "can.beans", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "can.beans.empty"},
new RewardItem { Shortname = "can.tuna", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "can.tuna.empty"},
new RewardItem { Shortname = "candycane"},
new RewardItem { Shortname = "cctv.camera"},
new RewardItem { Shortname = "ceilinglight"},
new RewardItem { Shortname = "charcoal"},
new RewardItem { Shortname = "chicken.burned"},
new RewardItem { Shortname = "chicken.cooked", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "chicken.raw"},
new RewardItem { Shortname = "chicken.spoiled"},
new RewardItem { Shortname = "chocolate"},
new RewardItem { Shortname = "cloth", MinAmount = 1, MaxAmount = 50},
new RewardItem { Shortname = "coffeecan.helmet"},
new RewardItem { Shortname = "corn", MinAmount = 1, MaxAmount = 5},
new RewardItem { Shortname = "seed.corn", MinAmount = 1, MaxAmount = 5},
new RewardItem { Shortname = "crossbow"},
new RewardItem { Shortname = "crude.oil", MinAmount = 1, MaxAmount = 50},
new RewardItem { Shortname = "explosive.timed", MinAmount = 1, MaxAmount = 2, Chance = 0.25f },
new RewardItem { Shortname = "explosive.satchel", MinAmount = 1, MaxAmount = 3, Chance = 0.25f },
new RewardItem { Shortname = "explosives", MinAmount = 1, MaxAmount = 15, Chance = 0.25f},
new RewardItem { Shortname = "fat.animal", MinAmount = 1, MaxAmount = 50},
new RewardItem { Shortname = "fish.cooked", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "fish.raw", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "flamethrower", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "weapon.mod.flashlight"},
new RewardItem { Shortname = "weapon.mod.burstmodule"},
new RewardItem { Shortname = "furnace.large"},
new RewardItem { Shortname = "gates.external.high.stone"},
new RewardItem { Shortname = "gates.external.high.wood"},
new RewardItem { Shortname = "granolabar", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "grenade.beancan", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "grenade.f1", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "fun.guitar"},
new RewardItem { Shortname = "hammer.salvaged"},
new RewardItem { Shortname = "hat.boonie"},
new RewardItem { Shortname = "hat.miner"},
new RewardItem { Shortname = "hatchet"},
new RewardItem { Shortname = "hazmatsuit"},
new RewardItem { Shortname = "seed.hemp", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "weapon.mod.holosight"},
new RewardItem { Shortname = "hq.metal.ore", MinAmount = 1, MaxAmount = 50},
new RewardItem { Shortname = "humanmeat.burned"},
new RewardItem { Shortname = "humanmeat.cooked", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "humanmeat.raw", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "humanmeat.spoiled"},
new RewardItem { Shortname = "icepick.salvaged"},
new RewardItem { Shortname = "jacket.snow"},
new RewardItem { Shortname = "jacket"},
new RewardItem { Shortname = "jackolantern.angry"},
new RewardItem { Shortname = "jackolantern.happy"},
new RewardItem { Shortname = "trap.landmine"},
new RewardItem { Shortname = "lantern"},
new RewardItem { Shortname = "largemedkit"},
new RewardItem { Shortname = "weapon.mod.lasersight"},
new RewardItem { Shortname = "leather"},
new RewardItem { Shortname = "longsword"},
new RewardItem { Shortname = "mace"},
new RewardItem { Shortname = "machete"},
new RewardItem { Shortname = "mask.balaclava"},
new RewardItem { Shortname = "bearmeat.burned"},
new RewardItem { Shortname = "bearmeat.cooked", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "bearmeat", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "meat.pork.burned"},
new RewardItem { Shortname = "meat.pork.cooked", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "meat.boar", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "wolfmeat.burned"},
new RewardItem { Shortname = "wolfmeat.cooked", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "wolfmeat.raw", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "wolfmeat.spoiled"},
new RewardItem { Shortname = "metal.facemask", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "metal.fragments", MinAmount = 100, MaxAmount = 300},
new RewardItem { Shortname = "metal.ore", MinAmount = 100, MaxAmount = 300},
new RewardItem { Shortname = "metal.plate.torso", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "metal.refined", MinAmount = 10, MaxAmount = 30},
new RewardItem { Shortname = "fish.minnows"},
new RewardItem { Shortname = "mushroom", MinAmount = 1, MaxAmount = 3},
new RewardItem { Shortname = "weapon.mod.muzzleboost"},
new RewardItem { Shortname = "weapon.mod.muzzlebrake"},
new RewardItem { Shortname = "pickaxe"},
new RewardItem { Shortname = "pistol.revolver", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "pistol.semiauto", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "pookie.bear"},
new RewardItem { Shortname = "xmas.present.large"},
new RewardItem { Shortname = "xmas.present.medium"},
new RewardItem { Shortname = "xmas.present.small"},
new RewardItem { Shortname = "pumpkin"},
new RewardItem { Shortname = "seed.pumpkin"},
new RewardItem { Shortname = "target.reactive"},
new RewardItem { Shortname = "riot.helmet"},
new RewardItem { Shortname = "roadsign.jacket"},
new RewardItem { Shortname = "roadsign.kilt"},
new RewardItem { Shortname = "rocket.launcher", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "salvaged.cleaver"},
new RewardItem { Shortname = "salvaged.sword"},
new RewardItem { Shortname = "santahat"},
new RewardItem { Shortname = "weapon.mod.small.scope"},
new RewardItem { Shortname = "rifle.semiauto", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "shelves" },
new RewardItem { Shortname = "shotgun.pump", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "shotgun.waterpipe", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "shotgun.double", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "shutter.metal.embrasure.a"},
new RewardItem { Shortname = "shutter.metal.embrasure.b"},
new RewardItem { Shortname = "shutter.wood.a"},
new RewardItem { Shortname = "sign.hanging.banner.large"},
new RewardItem { Shortname = "sign.hanging"},
new RewardItem { Shortname = "sign.hanging.ornate"},
new RewardItem { Shortname = "sign.pictureframe.landscape"},
new RewardItem { Shortname = "sign.pictureframe.portrait"},
new RewardItem { Shortname = "sign.pictureframe.tall"},
new RewardItem { Shortname = "sign.pictureframe.xl"},
new RewardItem { Shortname = "sign.pictureframe.xxl"},
new RewardItem { Shortname = "sign.pole.banner.large"},
new RewardItem { Shortname = "sign.post.double"},
new RewardItem { Shortname = "sign.post.single"},
new RewardItem { Shortname = "sign.post.town"},
new RewardItem { Shortname = "sign.post.town.roof"},
new RewardItem { Shortname = "sign.wooden.huge"},
new RewardItem { Shortname = "sign.wooden.large"},
new RewardItem { Shortname = "sign.wooden.medium"},
new RewardItem { Shortname = "weapon.mod.silencer"},
new RewardItem { Shortname = "skull.human"},
new RewardItem { Shortname = "skull.wolf"},
new RewardItem { Shortname = "small.oil.refinery"},
new RewardItem { Shortname = "fish.troutsmall"},
new RewardItem { Shortname = "smallwaterbottle"},
new RewardItem { Shortname = "smg.2", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "spear.stone"},
new RewardItem { Shortname = "spikes.floor"},
new RewardItem { Shortname = "stocking.large"},
new RewardItem { Shortname = "stocking.small"},
new RewardItem { Shortname = "stones", MinAmount = 100, MaxAmount = 300},
new RewardItem { Shortname = "sulfur", MinAmount = 100, MaxAmount = 300},
new RewardItem { Shortname = "sulfur.ore", MinAmount = 100, MaxAmount = 300},
new RewardItem { Shortname = "surveycharge"},
new RewardItem { Shortname = "syringe.medical" },
new RewardItem { Shortname = "targeting.computer"},
new RewardItem { Shortname = "smg.thompson", Chance = 0.25f, BPChance = 0.15f},
new RewardItem { Shortname = "wall.external.high.stone"},
new RewardItem { Shortname = "wall.external.high"},
new RewardItem { Shortname = "wall.window.bars.toptier"},
new RewardItem { Shortname = "water.catcher.large"},
new RewardItem { Shortname = "water.barrel"},
new RewardItem { Shortname = "waterjug"},
new RewardItem { Shortname = "wood", MinAmount = 100, MaxAmount = 300},
new RewardItem { Shortname = "wood.armor.jacket"},
new RewardItem { Shortname = "wood.armor.pants"}
}
};
}
private void Unload()
{
Unsubscribe(nameof(OnEntityDeath));
}
}
}