C#:
using System.Linq;
namespace Oxide.Plugins
{
[Info("FNpcVendingFastBuy", "fufeldev", "1.0.0")]
public class FNpcVendingFastBuy : RustPlugin
{
private void OnServerInitialized()
{
NextTick(ResetAll);
timer.Every(5f, ResetAll);
}
private void OnEntitySpawned(NPCVendingMachine vending)
{
if (vending is InvisibleVendingMachine) return;
NextTick(() => ResetDiscounts(vending));
}
private void OnRefreshVendingStock(VendingMachine vending, ItemDefinition itemDefinition)
{
var npcVending = vending as NPCVendingMachine;
if (npcVending == null) return;
if (npcVending is InvisibleVendingMachine) return;
NextTick(() => ResetDiscounts(npcVending));
}
private object OnBuyVendingItem(VendingMachine vending, BasePlayer player, int sellOrderId, int numberOfTransactions)
{
var npcVending = vending as NPCVendingMachine;
if (npcVending == null || player == null) return null;
if (npcVending is InvisibleVendingMachine) return null;
ResetDiscounts(npcVending);
var realSellOrderId = GetRealSellOrderId(npcVending, sellOrderId);
if (realSellOrderId < 0) return true;
npcVending.DoTransaction(player, realSellOrderId, numberOfTransactions);
NextTick(() => ResetDiscounts(npcVending));
return true;
}
private void ResetAll()
{
foreach (var vending in BaseNetworkable.serverEntities.OfType<NPCVendingMachine>())
{
if (vending is InvisibleVendingMachine) continue;
ResetDiscounts(vending);
}
}
private void ResetDiscounts(NPCVendingMachine vending)
{
if (vending == null || vending.IsDestroyed) return;
if (vending is InvisibleVendingMachine) return;
vending.BypassDynamicPricing = true;
if (vending.sellOrders == null || vending.sellOrders.sellOrders == null) return;
foreach (var sellOrder in vending.sellOrders.sellOrders)
{
sellOrder.priceMultiplier = 1f;
sellOrder.receivedQuantityMultiplier = 1f;
}
vending.SendSellOrders();
vending.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
}
private int GetRealSellOrderId(NPCVendingMachine vending, int visibleSellOrderId)
{
if (vending == null || vending.sellOrders == null || vending.sellOrders.sellOrders == null) return -1;
var visibleIndex = 0;
for (int i = 0; i < vending.sellOrders.sellOrders.Count; i++)
{
var sellOrder = vending.sellOrders.sellOrders[i];
var itemDefinition = ItemManager.FindItemDefinition(sellOrder.itemToSellID);
var currencyDefinition = ItemManager.FindItemDefinition(sellOrder.currencyID);
if (itemDefinition == null || currencyDefinition == null) continue;
if (!itemDefinition.IsAllowed(vending.CurrentEraRestriction) || !currencyDefinition.IsAllowed(vending.CurrentEraRestriction)) continue;
if (visibleIndex == visibleSellOrderId) return i;
visibleIndex++;
}
return -1;
}
}
}