C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Newtonsoft.Json;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
// Requires: FriendlyFire
namespace Oxide.Plugins
{
[Info("Punish Friendly Fire", "collect_vood", "1.2.1")]
[Description("Punish player by X% of the damage done to friends.")]
/*=======================================================================================================================
*
*
* 17th november 2018
*
* THANKS TO THE OXIDE/UMOD TEAM for coding quality, ideas, and time spent for the community
*
*
*********************************************
* Original author : Vliek on versions <1.1.0
* Maintainer(s) : BuzZ 20181116 from v1.1.0
collect_vood since 20190926 from v1.2.0
*********************************************
*=======================================================================================================================*/
public class PunishFF : CovalencePlugin
{
[PluginReference]
private Plugin FriendlyFire;
#region Localization
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>()
{
{ "PunishFriendlyFire", "Friendly fire punishment damage: {0}" },
}, this);
}
#endregion
#region Config
private ConfigurationFile Configuration;
private class ConfigurationFile
{
[JsonProperty(PropertyName = "Percentage of damage to punish")]
public int PercentagePunish = 50;
[JsonProperty(PropertyName = "Only punish damage on players with permission")]
public bool OnlyPunishPermission = false;
[JsonProperty(PropertyName = "Give damage permission")]
public string GivePermission = "punishff.give";
}
protected override void LoadDefaultConfig()
{
PrintWarning("Creating a new configuration file");
Configuration = new ConfigurationFile();
}
protected override void LoadConfig()
{
base.LoadConfig();
Configuration = Config.ReadObject<ConfigurationFile>();
SaveConfig();
}
protected override void SaveConfig() => Config.WriteObject(Configuration);
#endregion
#region Hooks
private void Init()
{
permission.RegisterPermission(Configuration.GivePermission, this);
}
private void OnFriendAttacked(IPlayer attacker, IPlayer victim, HitInfo info)
{
//So damage is correct (armor values etc applied)
NextTick(() =>
{
if (attacker == null || victim == null || info == null) return;
float amount = info.damageTypes.Total();
float scale = Configuration.PercentagePunish / 100f;
float dmgAmount = amount * scale;
if (!Configuration.OnlyPunishPermission)
{
attacker.Hurt(dmgAmount);
attacker.Reply(GetMessage("PunishFriendlyFire", attacker, dmgAmount.ToString()));
}
else
{
if (!HasPermission(victim)) return;
attacker.Hurt(dmgAmount);
attacker.Reply(GetMessage("PunishFriendlyFire", attacker, dmgAmount.ToString()));
}
});
}
#endregion
#region Helpers
private string GetMessage(string key, IPlayer player, params string[] args) => String.Format(lang.GetMessage(key, this, player.Id), args);
private bool HasPermission(IPlayer player) => permission.UserHasPermission(player.Id, Configuration.GivePermission);
#endregion
}
}