C#:
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust;
using Oxide.Game.Rust.Cui;
using ProtoBuf;
using Rust;
using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Pivo", "molik", "1.0.0")]
class Pivo : RustPlugin
{
[PluginReference] Plugin ImageLibrary, Clans, ZoneManager, CopyPaste;
private List<Vector3> PosList = new List<Vector3>();
private int nextCrate = 0;
int StartTime;
Dictionary<ulong, DBSettings> DataBonus = new Dictionary<ulong, DBSettings>();
public class DBSettings
{
public string DisplayName;
public int Points = 0;
public Dictionary<string, int> Settings = new Dictionary<string, int>()
{
["gather"] = 0,
["damage"] = 0,
["raidblock"] = 0
};
}
void SaveDataBase()
{
Interface.Oxide.DataFileSystem.WriteObject("PosPivo", PosList);
Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("Pivo/PlayerList", DataBonus);
}
void OnPlayerConnected(BasePlayer player)
{
if (!DataBonus.ContainsKey(player.userID))
DataBonus.Add(player.userID, new DBSettings());
DataBonus[player.userID].DisplayName = player.displayName;
}
private void OnServerInitialized()
{
if (Interface.Oxide.DataFileSystem.ExistsDatafile("Pivo/PlayerList"))
DataBonus = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, DBSettings>>("Pivo/PlayerList");
LoadData();
InvokeHandler.Instance.InvokeRepeating(CallToTimer, 0f, 1f);
foreach (var check in BasePlayer.activePlayerList)
OnPlayerConnected(check); }
/*[ChatCommand("gg")]
void gg(BasePlayer player)
{
HealBonus(player);
}*/
[ChatCommand("bonus")]
void ShowBonus(BasePlayer player)
{
var sb = new StringBuilder();
sb.Append("Ваши бонусы:\n");
sb.AppendLine($"Бонус на добычу: {DataBonus[player.userID].Settings["gather"]} сек.");
sb.AppendLine($"Бонус Х2 урон по пойстройкам: {DataBonus[player.userID].Settings["damage"]} сек.");
sb.AppendLine($"Иммунитет к рейд-блоку: {DataBonus[player.userID].Settings["raidblock"]} сек.");
player.ChatMessage(sb.ToString().TrimEnd());
}
bool HasBonus(BasePlayer player)
{
if (DataBonus[player.userID].Settings["gather"] > 0)
{
return true;
}
if (DataBonus[player.userID].Settings["raidblock"] > 0)
{
return true;
}
if (DataBonus[player.userID].Settings["damage"] > 0)
{
return true;
}
return false;
}
void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
{
var player = info.InitiatorPlayer;
if (player == null)
return;
if (!HasBonus(player)) return;
if (entity.PrefabName.Contains("assets/prefabs/building core"))
{
info.damageTypes.ScaleAll(2f);
return;
}
return;
}
void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item)
{
if (item == null || player == null) return;
if (!HasBonus(player)) return;
int Rate = item.amount * 2;
item.amount = Rate;
}
void OnDispenserGather(ResourceDispenser disp, BasePlayer player, Item item)
{
if (item == null || player == null) return;
if (!HasBonus(player)) return;
int Rate = item.amount * 2;
item.amount = Rate;
}
private void Unload()
{
InvokeHandler.Instance.InvokeRepeating(CallToTimer, 0f, 1f);
SaveDataBase();
}
void OnItemAction(Item item, string action, BasePlayer player)
{
var bonus = cfg.bonusitem.FirstOrDefault(x => x.skinid == item.skin);
if (bonus != null && action == "unwrap")
{
item.amount -= 1;
item.RemoveFromContainer();
DataBonus[player.userID].Settings[bonus.type] += 300;
if (bonus.type == "raidblock")
Server.Command($"grant.permission {player.userID} noescape.ignore 5m");
//if (bonus.type == "heal")
//HealBonus(player);
// item.RemoveFromWorld();
return;
}
return;
}
void CallToTimer()
{
foreach(var player in DataBonus)
{
TimerBonus(player.Key);
}
}
void TimerBonus(ulong player)
{
if (DataBonus[player].Settings["gather"] > 0)
{
DataBonus[player].Settings["gather"]--;
}
else
{
DestroyBonus(player, "gather");
}
if (DataBonus[player].Settings["raidblock"] > 0)
{
DataBonus[player].Settings["raidblock"]--;
}
else
{
DestroyBonus(player, "raidblock");
}
if (DataBonus[player].Settings["damage"] > 0)
{
DataBonus[player].Settings["damage"]--;
}
else
{
DestroyBonus(player, "damage");
}
}
void DestroyBonus(ulong player, string Key)
{
DataBonus[player].Settings[Key] = 0;
}
void LoadData()
{
PosList = Interface.Oxide?.DataFileSystem?.ReadObject<List<Vector3>>("PosPivo")
?? new List<Vector3>();
}
private ConfigData cfg;
public class ConfigData
{
[JsonProperty("КД спавна чинука")]
public int spawnRate;
[JsonProperty("Виды бонусов")]
public List<ConfigData.BonusType> bonusitem;
public class BonusType
{
[JsonProperty("Вид бонуса")]
public string type;
[JsonProperty("Скин предмета")]
public ulong skinid;
[JsonProperty("Название предмета")]
public string displayName;
}
}
protected override void LoadDefaultConfig()
{
var config = new ConfigData()
{
spawnRate = 3600,
bonusitem = new List<ConfigData.BonusType>()
{
new ConfigData.BonusType()
{
type = "damage",
displayName = "Бонус на урон по постройкам х2 (5 минут)",
skinid = 0
},
new ConfigData.BonusType()
{
type = "raidblock",
displayName = "Устойчивость к рейдблоку (5 минут)",
skinid = 0
},
new ConfigData.BonusType()
{
type = "gather",
displayName = "Бонус на добычу х2 (5 минут)",
skinid = 0
},
}
};
SaveConfig(config);
}
protected override void LoadConfig()
{
base.LoadConfig();
cfg = Config.ReadObject<ConfigData>();
SaveConfig(cfg);
}
private void SaveConfig(object config)
{
Config.WriteObject(config, true);
}
#region Commands
private Vector3 GetPos()
{
if (PosList.Count >= 0)
return PosList.ElementAt(UnityEngine.Random.Range(0, PosList.Count));
return Vector3.zero;
}
[ChatCommand("pos")]
private void cmdSetCratePos(BasePlayer p)
{
if (p.net.connection.authLevel < 2)
{
return;
}
PosList.Add(p.GetNetworkPosition());
SaveDataBase();
p.ChatMessage($"Добавлена точка спавна для ивента {p.GetNetworkPosition()}");
}
#endregion
}
}