C#:
using System.Collections.Generic;
using System.Linq;
namespace Oxide.Plugins
{
[Info("FNpcVendingLoot", "fufeldev", "1.0.0")]
public class FNpcVendingLoot : RustPlugin
{
private const int StockTransactions = 10;
private class VendingOrder
{
public string SellItem;
public int SellAmount;
public int ScrapPrice;
}
private readonly List<VendingOrder> _orders = new List<VendingOrder>
{
new VendingOrder { SellItem = "lowgradefuel", SellAmount = 500, ScrapPrice = 500 },
new VendingOrder { SellItem = "cloth", SellAmount = 1000, ScrapPrice = 700 },
new VendingOrder { SellItem = "leather", SellAmount = 500, ScrapPrice = 500 },
new VendingOrder { SellItem = "metal.fragments", SellAmount = 5000, ScrapPrice = 500 },
new VendingOrder { SellItem = "rope", SellAmount = 10, ScrapPrice = 60 },
new VendingOrder { SellItem = "sewingkit", SellAmount = 10, ScrapPrice = 120 },
new VendingOrder { SellItem = "gears", SellAmount = 10, ScrapPrice = 550 },
new VendingOrder { SellItem = "riflebody", SellAmount = 10, ScrapPrice = 600 },
new VendingOrder { SellItem = "chainsaw", SellAmount = 1, ScrapPrice = 150 },
new VendingOrder { SellItem = "jackhammer", SellAmount = 1, ScrapPrice = 150 }
};
private void OnServerInitialized()
{
NextTick(ApplyAll);
timer.Every(30f, ApplyAll);
}
private void OnEntitySpawned(NPCVendingMachine vending)
{
if (vending is InvisibleVendingMachine) return;
NextTick(() => ApplyVending(vending));
}
private void OnVendingTransaction(VendingMachine vending, BasePlayer buyer, int sellOrderId, int numberOfTransactions, ItemContainer targetContainer)
{
var npcVending = vending as NPCVendingMachine;
if (npcVending == null) return;
if (npcVending is InvisibleVendingMachine) return;
NextTick(() => ApplyVending(npcVending));
}
private void ApplyAll()
{
foreach (var vending in BaseNetworkable.serverEntities.OfType<NPCVendingMachine>())
{
if (vending is InvisibleVendingMachine) continue;
ApplyVending(vending);
}
}
private void ApplyVending(NPCVendingMachine vending)
{
if (vending == null || vending.IsDestroyed) return;
if (vending is InvisibleVendingMachine) return;
if (vending.sellOrders == null || vending.sellOrders.sellOrders == null)
vending.InstallDefaultSellOrders();
vending.CancelInvoke(vending.InstallFromVendingOrders);
vending.CancelInvoke(vending.Refill);
vending.ClearSellOrders();
vending.inventory.Clear();
vending.inventory.capacity = 128;
ItemManager.DoRemoves();
foreach (var order in _orders)
AddOrder(vending, order);
vending.RefreshSellOrderStockLevel();
vending.SendSellOrders();
vending.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
private void AddOrder(NPCVendingMachine vending, VendingOrder order)
{
var sellDefinition = ItemManager.FindItemDefinition(order.SellItem);
var scrapDefinition = ItemManager.FindItemDefinition("scrap");
if (sellDefinition == null || scrapDefinition == null) return;
var sellOrder = new ProtoBuf.VendingMachine.SellOrder();
sellOrder.ShouldPool = false;
sellOrder.itemToSellID = sellDefinition.itemid;
sellOrder.itemToSellAmount = order.SellAmount;
sellOrder.currencyID = scrapDefinition.itemid;
sellOrder.currencyAmountPerItem = order.ScrapPrice;
sellOrder.currencyIsBP = false;
sellOrder.itemToSellIsBP = false;
sellOrder.priceMultiplier = 1f;
sellOrder.receivedQuantityMultiplier = 1f;
vending.sellOrders.sellOrders.Add(sellOrder);
vending.transactionActive = true;
vending.inventory.AddItem(sellDefinition, order.SellAmount * StockTransactions, 0UL, ItemContainer.LimitStack.All);
vending.transactionActive = false;
}
}
}