C#:
using System.Collections.Generic;
using Oxide.Core.Configuration;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using UnityEngine;
using System.Linq;
using Oxide.Core;
using System;
using Oxide.Game.Rust.Cui;
using System.Text.RegularExpressions;
using Color = UnityEngine.Color;
using VLB;
using Rust;
// https://modhub.to
// This is a user submitted Rust Plugin checked and verified by ModHub
// ModHub is the largest Server Owner Trading Platform Online
namespace Oxide.Plugins
{
[Info("ChainSaw", "https://discord.gg/9vyTXsJyKR", "1.0.0", ResourceId = 58)]
[Description("ChainSaw")]
public class ChainSaw : RustPlugin
{
#region Classes
public class entityConfig
{
[JsonProperty("Damage amount tiers")]
public Dictionary<string, int> damage;
[JsonProperty("Tool damage health add")]
public Dictionary<string, float> toolDamage;
[JsonProperty("Required skinID")]
public ulong skinID;
}
public Dictionary<int, string> GetGrades = new Dictionary<int, string>()
{
{ -1, "None" },
{ 0 , "Twigs" },
{ 1 , "Wood" },
{ 2 , "Stone" },
{ 3 , "Metal" },
{ 4 , "TopTier" },
{ 5 , "Count" }
};
#endregion
#region Config
private ConfigData configData;
class ConfigData
{
[JsonProperty(PropertyName = "Entity short perfab name")]
public Settings settings { get; set; }
public class Settings
{
public Dictionary<string, entityConfig> DamageApply { get; set; }
}
public Oxide.Core.VersionNumber Version { get; set; }
}
protected override void LoadConfig()
{
base.LoadConfig();
configData = Config.ReadObject<ConfigData>();
if (configData.Version < Version)
UpdateConfigValues();
Config.WriteObject(configData, true);
}
protected override void LoadDefaultConfig() => configData = GetBaseConfig();
private ConfigData GetBaseConfig()
{
return new ConfigData
{
settings = new ConfigData.Settings
{
DamageApply = new Dictionary<string, entityConfig>()
},
Version = Version
};
}
protected override void SaveConfig() => Config.WriteObject(configData, true);
private void UpdateConfigValues()
{
PrintWarning("Config update detected! Updating config values...");
ConfigData baseConfig = GetBaseConfig();
if (configData.Version < new VersionNumber(1, 0, 4))
configData = baseConfig;
configData.Version = Version;
PrintWarning("Config update completed!");
}
#endregion
private void OnServerInitialized()
{
permission.RegisterPermission("chainsaw.use", this);
if (configData.settings.DamageApply.Count <= 0)
{
configData.settings.DamageApply.Add("door.hinged.wood" , new entityConfig() { damage = new Dictionary<string, int>(), toolDamage = new Dictionary<string, float>(), skinID = 0} );
configData.settings.DamageApply["door.hinged.wood"].damage.Add("None", 10);
configData.settings.DamageApply["door.hinged.wood"].damage.Add("Twigs", 0);
configData.settings.DamageApply["door.hinged.wood"].damage.Add("Wood", 10);
configData.settings.DamageApply["door.hinged.wood"].damage.Add("Stone", 20);
configData.settings.DamageApply["door.hinged.wood"].damage.Add("Metal", 30);
configData.settings.DamageApply["door.hinged.wood"].damage.Add("TopTier", 40);
configData.settings.DamageApply["door.hinged.wood"].toolDamage.Add("None", 3);
configData.settings.DamageApply["door.hinged.wood"].toolDamage.Add("Twigs", 3);
configData.settings.DamageApply["door.hinged.wood"].toolDamage.Add("Wood", 2);
configData.settings.DamageApply["door.hinged.wood"].toolDamage.Add("Stone", 1);
configData.settings.DamageApply["door.hinged.wood"].toolDamage.Add("Metal", 0.5f);
configData.settings.DamageApply["door.hinged.wood"].toolDamage.Add("TopTier", 0.1f);
configData.settings.DamageApply.Add("wall" , new entityConfig() { damage = new Dictionary<string, int>(), toolDamage = new Dictionary<string, float>(), skinID = 0} );
configData.settings.DamageApply["wall"].damage.Add("None", 10);
configData.settings.DamageApply["wall"].damage.Add("Twigs", 0);
configData.settings.DamageApply["wall"].damage.Add("Wood", 10);
configData.settings.DamageApply["wall"].damage.Add("Stone", 20);
configData.settings.DamageApply["wall"].damage.Add("Metal", 30);
configData.settings.DamageApply["wall"].damage.Add("TopTier", 40);
configData.settings.DamageApply["wall"].toolDamage.Add("None", 3f);
configData.settings.DamageApply["wall"].toolDamage.Add("Twigs", 3f);
configData.settings.DamageApply["wall"].toolDamage.Add("Wood", 2f);
configData.settings.DamageApply["wall"].toolDamage.Add("Stone", 1f);
configData.settings.DamageApply["wall"].toolDamage.Add("Metal", 0.5f);
configData.settings.DamageApply["wall"].toolDamage.Add("TopTier", 0.1f);
SaveConfig();
}
}
private void OnPlayerAttack(BasePlayer player, HitInfo info)
{
if (!permission.UserHasPermission(player.UserIDString, "chainsaw.use")) return;
if (player == null || info == null || info.Weapon == null || info.HitEntity == null) return;
string infoName = info.HitEntity.ShortPrefabName;
if (info.Weapon.name.ToLower().Contains("chain"))
{
//Puts(infoName);
if (configData.settings.DamageApply.ContainsKey(infoName))
{
if (configData.settings.DamageApply[infoName].skinID != 0 && info.Weapon.skinID != configData.settings.DamageApply[infoName].skinID) return;
doDamage(info.HitEntity, info.Weapon, infoName);
}
}
}
private void doDamage(BaseEntity entity, AttackEntity saw, string config)
{
if (entity == null || !configData.settings.DamageApply.ContainsKey(config)) return;
HitInfo nullHit = new HitInfo();
if (entity is BuildingBlock)
{
string grade = getGrade(entity as BuildingBlock);
int totalToDo = configData.settings.DamageApply[config].damage[grade];
if (totalToDo == 0) return;
nullHit.damageTypes.Add(Rust.DamageType.Blunt, totalToDo);
float damage = configData.settings.DamageApply[config].toolDamage[grade];
if (damage > 0)
{
Item theSaw = saw.GetItem();
if (theSaw != null && theSaw.hasCondition)
theSaw.RepairCondition(damage);
}
}
else
{
int totalToDo = configData.settings.DamageApply[config].damage["None"];
if (totalToDo == 0) return;
nullHit.damageTypes.Add(Rust.DamageType.Blunt, totalToDo);
float damage = configData.settings.DamageApply[config].toolDamage["None"];
if (damage > 0)
{
Item theSaw = saw.GetItem();
if (theSaw != null && theSaw.hasCondition)
theSaw.RepairCondition(damage);
}
}
nullHit.Weapon = saw;
entity.OnAttacked(nullHit);
}
private string getGrade(BuildingBlock block)
{
int grade = (int)block.grade;
if (grade != null)
{
if (grade == 5)
return GetGrades[-1];
else return GetGrades[grade];
}
return "None";
}
}
}