C#:
using System.Collections.Generic;
using System.Linq;
using Oxide.Core;
using Oxide.Core.Plugins;
using Rust;
namespace Oxide.Plugins
{
[Info("ClanObjectLimit", "YourName", "1.0.0")]
[Description("Sets a limit on the number of objects a clan can place on the server.")]
public class ClanObjectLimit : RustPlugin
{
private Dictionary<string, int> clanObjectCounts = new Dictionary<string, int>();
private void OnServerInitialized()
{
LoadData();
InitializeLimits();
}
private void OnNewSave(string filename)
{
clanObjectCounts.Clear();
}
private void Unload()
{
SaveData();
}
private void InitializeLimits()
{
var clans = plugins.Find("Clans");
if (clans == null)
{
Puts("Clans plugin not found.Make sure you have Clans installed.");
return;
}
clans.Call("RegisterClanHook", this, "OnClanAddOrUpdate");
}
private void OnClanAddOrUpdate(string tag)
{
if (!clanObjectCounts.ContainsKey(tag))
clanObjectCounts[tag] = 0;
}
private void OnEntitySpawned(BaseNetworkable entity)
{
if (!entity.isServer || !entity.isActiveAndEnabled)
return;
var buildingBlock = entity as BuildingBlock;
if (buildingBlock == null)
return;
var ownerId = buildingBlock.OwnerID.ToString();
var ownerClan = GetClanByPlayerId(ownerId);
if (ownerClan == null)
return;
if (!clanObjectCounts.ContainsKey(ownerClan))
clanObjectCounts[ownerClan] = 0;
clanObjectCounts[ownerClan]++;
if (clanObjectCounts[ownerClan] > GetClanObjectLimit())
{
buildingBlock.Kill(BaseNetworkable.DestroyMode.None);
SendReply(buildingBlock.OwnerID, "You have reached the maximum number of objects you can place.");
}
}
private string GetClanByPlayerId(string playerId)
{
var clans = plugins.Find("Clans");
if (clans == null)
return null;
var clanData = clans.Call("GetClan", playerId);
if (clanData != null)
return clanData.ToString();
return null;
}
private int GetClanObjectLimit()
{
// Change this method to return the desired object limit for clans
return 50;
}
// Save and load data using Oxide's datafile system
private void SaveData() => Interface.Oxide.DataFileSystem.WriteObject(Name, clanObjectCounts);
private void LoadData()
{
try
{
clanObjectCounts = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<string, int>>(Name);
}
catch
{
clanObjectCounts = new Dictionary<string, int>();
}
}
}
}