C#:
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System;
namespace Oxide.Plugins
{
[Info("RepairHammer", "Own3r/rostov114/BadMandarin", "1.0.0")]
public class RepairHammer : RustPlugin
{
#region Class
private class Resources
{
private Dictionary<string, int> _resource = new Dictionary<string, int>();
public void Add(BuildingGrade.Enum grade, int amount)
{
string _grade = grade.ToString().ToLower();
if (_grade == "twigs")
_grade = "wood";
if (!_resource.ContainsKey(_grade))
_resource.Add(_grade, amount);
else
_resource[_grade] += amount;
}
public Dictionary<string, int> Result()
{
return _resource;
}
}
#endregion
#region Language
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["BuildingPrivlidgeNeed"] = "For a complete home repair you need a Building Privilege!",
["Repaired"] = "You repaired {0} blocks by spending:",
["wood"] = "Wood",
["stone"] = "Stones",
["metal"] = "Metal Fragments",
["toptier"] = "HQM"
}, this);
lang.RegisterMessages(new Dictionary<string, string>
{
["BuildingPrivlidgeNeed"] = "Для полной починки дома нужен шкаф!",
["Repaired"] = "Вы отремонтировали {0} блоков потратив:",
["wood"] = "Дерево",
["stone"] = "Камни",
["metal"] = "Фрагменты металла",
["toptier"] = "МВК"
}, this, "ru");
}
private string _(string key, BasePlayer player, params object[] args)
{
return string.Format(lang.GetMessage(key, this, player.UserIDString), args);
}
#endregion
#region Oxide Hooks
private void Init()
{
permission.RegisterPermission("repairhammer.solo", this);
permission.RegisterPermission("repairhammer.all", this);
}
private object OnStructureRepair(BaseCombatEntity entity, BasePlayer player)
{
if (!(entity is BuildingBlock))
return null;
if (!HasPermission(player, "repairhammer.solo") && !HasPermission(player, "repairhammer.all"))
return null;
if (entity.SecondsSinceAttacked <= 30f) // Делаем выход и ничего не пишем, да бы игроки не тупили, ибо я затупил, ну да хлэбушек там все дела :)
return null;
BuildingPrivlidge buildingprivlidge = (entity as DecayEntity).GetBuildingPrivilege();
if(buildingprivlidge == null)
{
SendReply(player, _("BuildingPrivlidgeNeed", player));
return null;
}
int repaired = 0;
Resources resources = new Resources();
if (HasPermission(player, "repairhammer.all"))
{
BuildingManager.Building building = buildingprivlidge.GetBuilding();
if (building == null)
return null;
if (!building.HasBuildingBlocks())
return null;
foreach (BuildingBlock buildingBlock in building.buildingBlocks)
{
if (buildingBlock.health == buildingBlock.MaxHealth())
continue;
if (buildingBlock.SecondsSinceAttacked <= 30)
continue;
int resamount = 0;
if (TakeResoures(player, buildingBlock, out resamount))
{
buildingBlock.health = buildingBlock.MaxHealth();
resources.Add(buildingBlock.grade, resamount);
repaired++;
}
}
}
if (HasPermission(player, "repairhammer.solo") && repaired == 0) // Условие на наличие привелегии и отсуствии починенных блоков, если например игроку выдали 2 привелегии
{
BuildingBlock block = entity as BuildingBlock;
if (block == null)
return null;
if (block.health == block.MaxHealth())
return false;
int resamount = 0;
if (TakeResoures(player, block, out resamount))
{
block.health = block.MaxHealth();
resources.Add(block.grade, resamount);
repaired++;
}
}
if (repaired == 0)
return null;
string message = _("Repaired", player, repaired) + Environment.NewLine;
foreach (var resource in resources.Result())
{
message += " " + _(resource.Key, player) + $": {resource.Value}" + Environment.NewLine;
}
SendReply(player, message);
return false;
}
#endregion
#region Helpers
private bool HasPermission(BasePlayer player, string _permission)
{
return permission.UserHasPermission(player.UserIDString, _permission);
}
private bool TakeResoures(BasePlayer player, BuildingBlock block, out int resamount)
{
resamount = 0;
List<ItemAmount> itemsneed = block.RepairCost(1f - block.healthFraction);
if (itemsneed == null || itemsneed.Count < 1)
return false;
Item iteminfo = ItemManager.CreateByName(itemsneed[0].itemDef.shortname);
float amount = 0;
foreach (ItemAmount i in itemsneed)
amount += i.amount;
if (player.inventory.GetAmount(iteminfo.info.itemid) >= amount)
{
List<Item> list = new List<Item>();
player.inventory.Take(list, itemsneed[0].itemid, (int)amount);
player.Command(string.Concat(new object[]
{
"note.inv ",
itemsneed[0].itemid,
" ",
amount * -1f
}));
foreach (Item item in list)
item.Remove(0f);
resamount = (int)amount;
return true;
}
return false;
}
#endregion
}
}