C#:
using Rust;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.IO;
namespace Oxide.Plugins {
[Info("TPClan", "pluginfuel.ru", "20.0.2")]
public class TPClan : RustPlugin {
#region [Vars]
[PluginReference]
private Plugin ImageLibrary = null, TPTournament = null, TPCaptureZone = null, QuarryCapture = null, TPRTCapture = null;
private const String Layer = "TPClan.Layer";
private const Boolean LanguageEn = false;
private readonly Regex Regex = new Regex(@"<avatarFull><!\[CDATA\[(.*)\]\]></avatarFull>");
private readonly String[] _gatherHooks = {
"OnDispenserGather", "OnDispenserBonus", "OnCollectiblePickup"
}
;
private readonly String[] _gatherItem = {
"wood", "stones", "metal.ore", "sulfur.ore", "hq.metal.ore", "cloth", "leather", "fat.animal", "loot-barrel", "metal.refined", "metal.fragments", "sulfur", "charcoal"
}
;
private readonly String[] _wearItem = {
"hoodie", "pants", "shoes.boots", "metal.facemask", "metal.plate.torso", "roadsign.kilt"
}
;
private readonly Dictionary<UInt64, BasePlayer> _lastHeli = new Dictionary<UInt64, BasePlayer>();
private readonly Dictionary<String, Int32> _itemIds = new Dictionary<String, Int32>();
private List<BuildingPrivlidge> _cupboardList = new List<BuildingPrivlidge>();
private List<CodeLock> _codeLockList = new List<CodeLock>();
private List<SamSite> _sameSiteList = new List<SamSite>();
private Dictionary<UInt64, ClanData> _playerToClan = new Dictionary<UInt64, ClanData>();
private List<UInt64> _lootEntity = new List<UInt64>();
private Dictionary<UInt64, DateTime> _cooldownPlayer = new Dictionary<UInt64, DateTime>();
private static TPClan _;
private static StringBuilder sb;
#endregion
#region [ImageLibrary]
private Boolean HasImage(String imageName, UInt64 imageId = 0) => ImageLibrary?.Call<Boolean>("HasImage", imageName, imageId) ?? false;
private Boolean AddImage(String url, String shortname, UInt64 skin = 0) => ImageLibrary?.Call<Boolean>("AddImage", url, shortname, skin) ?? false;
private String GetImage(String shortname, UInt64 skin = 0) => ImageLibrary?.Call<String>("GetImage", shortname, skin);
#endregion
#region [Clan-Data]
private List<ClanData> _clansList = new List<ClanData>();
private void LoadClans() {
try {
_clansList = Interface.Oxide.DataFileSystem.ReadObject<List<ClanData>>($"{Name}/ClansList");
if (_clansList != null) {
foreach (var clan in _clansList) {
if (clan.Task == null) {
clan.Task = String.Empty;
}
}
}
}
catch (Exception e) {
PrintError(e.ToString());
}
if (_clansList == null) _clansList = new List<ClanData>();
}
private void SaveClans() {
Interface.Oxide.DataFileSystem.WriteObject($"{Name}/ClansList", _clansList);
}
private class ClanData {
public String ClanTag;
public String Avatar;
public UInt64 LeaderID;
public String LeaderName;
[JsonProperty("Task")]
public String Task;
public UInt64 TeamID;
public Dictionary<String, GatherSettings> GatherClan = new Dictionary<String, GatherSettings>() {
["wood"]
= new GatherSettings(), ["stones"] = new GatherSettings(), ["metal.ore"] = new GatherSettings(), ["sulfur.ore"] = new GatherSettings(), ["hq.metal.ore"] = new GatherSettings(), ["cloth"] = new GatherSettings(), ["leather"] = new GatherSettings(), ["fat.animal"] = new GatherSettings(), ["loot-barrel"] = new GatherSettings()
}
;
public Dictionary<String, UInt64> SkinList = new Dictionary<String, UInt64>() {
["hoodie"]
= 0, ["pants"] = 0, ["shoes.boots"] = 0, ["metal.facemask"] = 0, ["metal.plate.torso"] = 0, ["roadsign.kilt"] = 0,
}
;
public Dictionary<UInt64, PlayerData> Members = new Dictionary<UInt64, PlayerData>();
public List<UInt64> Moderators = new List<UInt64>();
[JsonIgnore]
private RelationshipManager.PlayerTeam Team => RelationshipManager.ServerInstance.FindTeam(TeamID) ?? FindOrCreateTeam();
public class PlayerData {
public Int32 Point = 0;
public Int32 Kill = 0;
public Int32 Death = 0;
public Boolean FriendlyFire;
public Int32 Online;
public Dictionary<String, Int32> GatherMember = new Dictionary<String, Int32>() {
["wood"]
= 0, ["stones"] = 0, ["metal.ore"] = 0, ["sulfur.ore"] = 0, ["hq.metal.ore"] = 0, ["cloth"] = 0, ["leather"] = 0, ["fat.animal"] = 0, ["loot-barrel"] = 0
}
;
}
public class GatherSettings {
public Int32 Farm;
public Int32 Need;
}
public Boolean IsOwner(String userId) => IsOwner(UInt64.Parse(userId));
public Boolean IsOwner(UInt64 userId) => LeaderID == userId;
public Boolean IsModerator(String userId) => IsModerator(UInt64.Parse(userId));
public Boolean IsModerator(UInt64 userId) => Moderators.Contains(userId) || IsOwner(userId);
public Boolean IsMember(String userId) => IsMember(UInt64.Parse(userId));
public Boolean IsMember(UInt64 userId) => Members.ContainsKey(userId);
public RelationshipManager.PlayerTeam FindOrCreateTeam() {
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.FindTeam(TeamID) ?? RelationshipManager.ServerInstance.FindPlayersTeam(LeaderID);
if (team != null) {
if (team.teamLeader == LeaderID) {
TeamID = team.teamID;
return team;
}
team.RemovePlayer(LeaderID);
}
return CreateTeam();
}
public RelationshipManager.PlayerTeam CreateTeam() {
RelationshipManager.PlayerTeam team = RelationshipManager.ServerInstance.CreateTeam();
team.teamLeader = LeaderID;
AddPlayer(LeaderID, team);
TeamID = team.teamID;
return team;
}
public RelationshipManager.PlayerTeam FindTeam() {
RelationshipManager.PlayerTeam leaderTeam = RelationshipManager.ServerInstance.FindPlayersTeam(LeaderID);
if (leaderTeam != null) {
TeamID = leaderTeam.teamID;
return leaderTeam;
}
return null;
}
public void SetTeam(UInt64 teamID) => TeamID = teamID;
public void AddPlayer(UInt64 member, RelationshipManager.PlayerTeam team = null) {
if (team == null) team = Team;
if (!team.members.Contains(member)) team.members.Add(member);
RelationshipManager.ServerInstance.playerToTeam[member] = team;
BasePlayer player = RelationshipManager.FindByID(member);
if (player != null) {
if (player.Team != null && player.Team.teamID != team.teamID) {
player.Team.RemovePlayer(player.userID);
player.ClearTeam();
}
player.currentTeam = team.teamID;
team.MarkDirty();
player.SendNetworkUpdate();
}
}
public static ClanData CreateNewClan(String clanTag, BasePlayer player) {
ClanData clan = new ClanData {
ClanTag = clanTag, Avatar = $"{_.Name}.Avatar{player.UserIDString}", LeaderID = player.userID, LeaderName = player.displayName, Task = String.Empty
}
;
clan.Members.Add(player.userID, new PlayerData());
_._clansList.Add(clan);
if (_config.TagInName) player.displayName = $"[{clanTag}] {player.IPlayer.Name}";
if (_config.AutoTeamCreation) clan.FindOrCreateTeam();
_._playerToClan[player.userID] = clan;
ClanCreate(clanTag);
return clan;
}
public void Disband() {
List<String> memberUserIDs = Facepunch.Pool.GetList<string>();
memberUserIDs.AddRange(Members.Keys.Select(x => x.ToString()));
ClanDisbanded(memberUserIDs);
ClanDisbanded(ClanTag, memberUserIDs);
Facepunch.Pool.FreeList(ref memberUserIDs);
Members.Keys.ToList().ForEach(member => Kick(member, true));
foreach (KeyValuePair<String, UInt64> skin in SkinList) {
if (skin.Value == 0) continue;
if (_._skinsUsedList[skin.Key].Contains(skin.Value)) _._skinsUsedList[skin.Key].Remove(skin.Value);
}
ClanDestroy(ClanTag);
if (_config.AutoTeamCreation) {
Team?.members.ToList().ForEach(member => {
Team.RemovePlayer(member);
BasePlayer player = RelationshipManager.FindByID(member);
if (player != null) player.ClearTeam();
}
);
}
_._clansList.Remove(this);
}
public void Join(BasePlayer player) {
Members.Add(player.userID, new PlayerData());
if (_config.TagInName) player.displayName = $"[{ClanTag}] {player.displayName}";
if (_config.AutoTeamCreation) {
if (player.Team != Team) player.Team?.RemovePlayer(player.userID);
Team?.AddPlayer(player);
}
foreach (UInt64 member in Members.Keys.ToList()) {
AuthBuilding(member, player.userID);
AuthBuilding(player.userID, member);
AuthCodeLock(member, player.userID);
AuthCodeLock(player.userID, member);
}
if (_config.ChangeOwnerIDForLeader) ChangeOwnerIDForLeader(player.userID, LeaderID);
_._playerToClan[player.userID] = this;
ClanMemberJoined(player.UserIDString, ClanTag);
}
public void Kick(UInt64 target, Boolean disband = false) {
String targetStringId = target.ToString();
Members.Remove(target);
Moderators.Remove(target);
_._playerToClan.Remove(target);
if (_config.TagInName) {
String name = _.covalence.Players.FindPlayerById(targetStringId)?.Name;
if (!String.IsNullOrWhiteSpace(name)) {
BasePlayer player = RelationshipManager.FindByID(target);
if (player != null) player.displayName = name;
}
}
if (!disband) {
if (_config.AutoTeamCreation && Team != null) Team.RemovePlayer(target);
if (Members.Count == 0) {
Disband();
}
else {
if (LeaderID == target) SetLeader((Moderators.Count > 0 ? Moderators : Members.Keys.ToList()).GetRandom());
}
}
foreach (UInt64 member in Members.Keys) {
DeAuthBuilding(member, target);
DeAuthBuilding(target, member);
DeAuthCodeLock(member, target);
DeAuthCodeLock(target, member);
}
ClanMemberGone(targetStringId, ClanTag);
}
public void SetLeader(UInt64 target) {
if (!Members.ContainsKey(target)) return;
if (Moderators.Contains(target)) Moderators.Remove(target);
LeaderName = _.covalence.Players.FindPlayerById(target.ToString())?.Name;
if (_config.ChangeOwnerIDForLeader) ChangeOwnerIDForLeader(LeaderID, target);
LeaderID = target;
Avatar = $"{_.Name}.Avatar{target}";
if (_config.AutoTeamCreation) Team.SetTeamLeader(target);
}
public Int32 GetScore() => Members.Sum(member => member.Value.Point);
public void UpdateLeaderName(String name) => LeaderName = name;
public Int32 Online() => Members.Keys.Count(p => BasePlayer.Find(p.ToString()) != null);
public String GetPercentClan() {
Int32 need = GatherClan.Sum(x => x.Value.Need);
Int32 current = GatherClan.Sum(x => x.Value.Farm);
return $"{(Single)Math.Round(((Single)current * 100) / need, 2)}%";
}
public String GetPercentPlayer(UInt64 playerID) {
Int32 need = GatherClan.Sum(x => x.Value.Need);
Int32 current = Members[playerID].GatherMember.Sum(p => p.Value);
return $"{(Single)Math.Round(((Single)current * 100) / need, 2)}%";
}
}
#endregion
#region [Skin-Data]
private Dictionary<String, List<UInt64>> _skinsList = new Dictionary<String, List<UInt64>>();
private void FillingSkinList() {
Boolean needSave = false;
foreach (String item in _wearItem) {
if (_skinsList.ContainsKey(item) && _skinsList[item] != null && _skinsList[item].Count > 0) continue;
List<UInt64> skins = ImageLibrary?.Call<List<UInt64>>("GetImageList", item) ?? new List<UInt64>();
// Если скины не загружены из ImageLibrary, пытаемся загрузить из сохранённых данных
if (skins.Count == 0 && _skinsList.ContainsKey(item)) {
skins = _skinsList[item];
}
_skinsList[item] = skins;
if (!_skinsUsedList.ContainsKey(item)) {
_skinsUsedList[item] = new List<UInt64>();
}
needSave = true;
}
if (needSave) {
SaveSkins();
SaveUsedSkins();
}
}
private void LoadSkins() {
try {
_skinsList = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<String, List<UInt64>>>($"{Name}/ClansSkin");
}
catch (Exception e) {
PrintError(e.ToString());
}
if (_skinsList == null) _skinsList = new Dictionary<String, List<UInt64>>();
}
private void SaveSkins() => Interface.Oxide.DataFileSystem.WriteObject($"{Name}/ClansSkin", _skinsList);
#endregion
#region [SkinUseed-Data]
private Dictionary<String, List<UInt64>> _skinsUsedList = new Dictionary<String, List<UInt64>>();
private void LoadUsedSkins() {
try {
_skinsUsedList = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<String, List<UInt64>>>($"{Name}/ClansSkinUsed");
}
catch (Exception e) {
PrintError(e.ToString());
}
if (_skinsUsedList == null) _skinsUsedList = new Dictionary<String, List<UInt64>>();
}
private void SaveUsedSkins() => Interface.Oxide.DataFileSystem.WriteObject($"{Name}/ClansSkinUsed", _skinsUsedList);
#endregion
#region [Oxide-Api]
private void OnPluginLoaded(Plugin plugin) {
// Если загружена ImageLibrary, перезагружаем скины
if (plugin?.Name == "ImageLibrary") {
ImageLibrary = plugin;
FillingSkinList();
}
NextTick(() => {
foreach (String hook in _gatherHooks) {
Unsubscribe(hook);
Subscribe(hook);
}
}
);
}
private void OnServerSave() => SaveClans();
private void Init() {
_ = this;
sb = new StringBuilder();
LoadClans();
LoadSkins();
LoadUsedSkins();
if (!_config.BlockCreateTeam) Unsubscribe(nameof(OnTeamCreate));
AddCovalenceCommand(_config.ClanCommands.ToArray(), nameof(CmdClans));
AddCovalenceCommand("aclan", nameof(AdminCmdClans));
}
private void OnServerInitialized() {
FillingSkinList();
_imageUI = new ImageUI();
_imageUI.DownloadImage();
FillingTeams();
AddImage("https://i.postimg.cc/MpcXW1gf/cEBay4m.png", "loot-barrel");
_cupboardList = BaseNetworkable.serverEntities.OfType<BuildingPrivlidge>().ToList();
_codeLockList = BaseNetworkable.serverEntities.OfType<CodeLock>().ToList();
if (_config.ChangeOwnerIDForLeader) _sameSiteList = BaseNetworkable.serverEntities.OfType<SamSite>().ToList();
foreach (ClanData clan in _clansList) {
foreach (UInt64 playerID in clan.Members.Keys) _playerToClan[playerID] = clan;
}
foreach (BasePlayer player in BasePlayer.activePlayerList) OnPlayerConnected(player);
timer.Every(1f, TimeHandle);
}
private void Unload() {
foreach (BasePlayer player in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(player, Layer + ".Main");
if (_config.TagInName) {
String Name = player.IPlayer.Name;
player.displayName = Name;
}
}
if (_imageUI != null) {
_imageUI.UnloadImages();
_imageUI = null;
}
SaveClans();
SaveSkins();
SaveUsedSkins();
_ = null;
_config = null;
sb = null;
}
private void OnNewSave(String filename) {
try {
if (_clansList == null || _clansList.Count == 0) LoadClans();
if (_config.GameStoreSettings.Enable) RewardClans();
_clansList.Clear();
SaveClans();
}
catch (Exception e) {
PrintError($"[OnNewSave] : {e.Message}");
}
}
#endregion
#region [Rust-Api]
private void OnPlayerConnected(BasePlayer player) {
if (player == null || !player.userID.IsSteamId()) return;
GetAvatar(player.UserIDString, avatar => AddImage(avatar, $"{Name}.Avatar{player.UserIDString}"));
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
if (_config.TagInName) player.displayName = $"[{clan.ClanTag}] {player.IPlayer.Name}";
if (_config.AutoTeamCreation) clan.AddPlayer(player.userID);
if (clan.IsOwner(player.userID)) clan.UpdateLeaderName(player.IPlayer.Name);
}
private void OnPlayerDisconnected(BasePlayer player) {
if (player == null || !player.userID.IsSteamId()) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
if (_config.TagInName) player.displayName = $"{player.IPlayer.Name}";
}
private void OnEntitySpawned(BuildingPrivlidge buildingPrivlidge) {
if (buildingPrivlidge == null || !buildingPrivlidge.OwnerID.IsSteamId()) return;
_cupboardList.Add(buildingPrivlidge);
ClanData clan = FindClanByUser(buildingPrivlidge.OwnerID);
if (clan == null) return;
if (_config.ChangeOwnerIDForLeader) buildingPrivlidge.OwnerID = clan.LeaderID;
foreach (UInt64 member in clan.Members.Keys) {
buildingPrivlidge.authorizedPlayers.RemoveWhere((ulong x) => x == member);
buildingPrivlidge.authorizedPlayers.Add(member);
}
buildingPrivlidge.UpdateMaxAuthCapacity();
buildingPrivlidge.SendNetworkUpdate();
}
private void OnEntitySpawned(CodeLock codeLock) {
if (codeLock == null || !codeLock.OwnerID.IsSteamId()) return;
_codeLockList.Add(codeLock);
ClanData clan = FindClanByUser(codeLock.OwnerID);
if (clan == null) return;
if (_config.ChangeOwnerIDForLeader) codeLock.OwnerID = clan.LeaderID;
codeLock.code = $"{UnityEngine.Random.Range(0, 1000)}";
Effect.server.Run(codeLock.effectLocked.resourcePath, codeLock, 0, Vector3.zero, Vector3.forward, null, false);
codeLock.SetFlag(BaseEntity.Flags.Locked, true);
foreach (UInt64 member in clan.Members.Keys) {
if (!codeLock.whitelistPlayers.Contains(member)) codeLock.whitelistPlayers.Add(member);
}
codeLock.SendNetworkUpdate();
}
private void OnEntitySpawned(SamSite samSite) {
if (!_config.ChangeOwnerIDForLeader || samSite == null || !samSite.OwnerID.IsSteamId()) return;
_sameSiteList.Add(samSite);
ClanData clan = FindClanByUser(samSite.OwnerID);
if (clan == null) return;
samSite.OwnerID = clan.LeaderID;
samSite.SendNetworkUpdate();
}
private void OnEntitySpawned(AutoTurret autoTurret) {
if (!_config.ChangeOwnerIDForLeader || autoTurret == null || !autoTurret.OwnerID.IsSteamId()) return;
ClanData clan = FindClanByUser(autoTurret.OwnerID);
if (clan == null) return;
autoTurret.OwnerID = clan.LeaderID;
autoTurret.SendNetworkUpdate();
}
private object CanUseLockedEntity(BasePlayer player, KeyLock keyLock) {
if (player == null || keyLock == null || !keyLock.IsLocked()) return null;
BaseEntity parentEntity = keyLock.GetParentEntity();
UInt64 ownerID = keyLock.OwnerID.IsSteamId() ? keyLock.OwnerID : parentEntity != null ? parentEntity.OwnerID : 0;
if (!ownerID.IsSteamId() || ownerID == player.userID) return null;
if (IsTeammates(ownerID, player.userID)) return true;
return null;
}
private void OnEntityKill(BuildingPrivlidge buildingPrivlidge) {
if (buildingPrivlidge == null || !buildingPrivlidge.OwnerID.IsSteamId()) return;
if (_cupboardList.Contains(buildingPrivlidge)) _cupboardList.Remove(buildingPrivlidge);
}
private void OnEntityKill(CodeLock codeLock) {
if (codeLock == null || !codeLock.OwnerID.IsSteamId()) return;
if (_codeLockList.Contains(codeLock)) _codeLockList.Remove(codeLock);
}
private void OnEntityKill(SamSite samSite) {
if (!_config.ChangeOwnerIDForLeader || samSite == null || !samSite.OwnerID.IsSteamId()) return;
if (_sameSiteList.Contains(samSite)) _sameSiteList.Remove(samSite);
}
private object OnTurretTarget(AutoTurret turret, BasePlayer target) {
if (target == null || turret == null || target.limitNetworking || (turret is NPCAutoTurret && !target.userID.IsSteamId()) || target.userID == turret.OwnerID) return null;
ClanData clan = FindClanByUser(turret.OwnerID);
if (clan == null) return null;
if (clan.IsMember(target.userID)) return false;
return null;
}
private object OnSamSiteTarget(SamSite samSite, BaseVehicle vehicle) {
if (samSite == null || !samSite.OwnerID.IsSteamId() || vehicle == null) return null;
ClanData clan = FindClanByUser(samSite.OwnerID);
if (clan == null) return null;
if (vehicle.OwnerID == samSite.OwnerID || clan.IsMember(vehicle.OwnerID)) return true;
foreach (var mounted in vehicle.allMountPoints .Where(allMountPoint => allMountPoint != null && allMountPoint.mountable != null) .Select(allMountPoint => allMountPoint.mountable.GetMounted()) .Where(mounted => mounted != null)) {
if (mounted.userID == samSite.OwnerID || clan.IsMember(mounted.userID)) return true;
}
return null;
}
private void OnDispenserGather(ResourceDispenser dispenser, BasePlayer player, Item item) {
if (player == null || item == null || !_gatherItem.Contains(item.info.shortname)) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
String ShortName = item.info.shortname;
if (ShortName.Contains("metal.fragments")) ShortName = "metal.ore";
if (ShortName.Contains("sulfur")) ShortName = "sulfur.ore";
if (ShortName.Contains("metal.refined")) ShortName = "hq.metal.ore";
if (ShortName.Contains("charcoal")) ShortName = "wood";
clan.GatherClan[ShortName].Farm += item.amount;
clan.Members[player.userID].GatherMember[ShortName] += item.amount;
}
private void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item) {
if (player == null || item == null || !_gatherItem.Contains(item.info.shortname)) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
String ShortName = item.info.shortname;
if (ShortName.Contains("metal.fragments")) ShortName = "metal.ore";
if (ShortName.Contains("sulfur")) ShortName = "sulfur.ore";
if (ShortName.Contains("metal.refined")) ShortName = "hq.metal.ore";
if (ShortName.Contains("charcoal")) ShortName = "wood";
clan.GatherClan[ShortName].Farm += item.amount;
clan.Members[player.userID].GatherMember[ShortName] += item.amount;
clan.Members[player.userID].Point += GetPointConfig(ShortName);
}
private void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player) {
if (player == null || collectible == null || collectible.itemList == null) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
foreach (var itemAmount in collectible.itemList) {
if (itemAmount.itemDef != null) {
if (!_gatherItem.Contains(itemAmount.itemDef.shortname)) continue;
String ShortName = itemAmount.itemDef.shortname;
if (ShortName.Contains("metal.fragments")) ShortName = "metal.ore";
if (ShortName.Contains("sulfur")) ShortName = "sulfur.ore";
if (ShortName.Contains("metal.refined")) ShortName = "hq.metal.ore";
if (ShortName.Contains("charcoal")) ShortName = "wood";
clan.GatherClan[ShortName].Farm += (Int32)itemAmount.amount;
clan.Members[player.userID].GatherMember[ShortName] += (Int32)itemAmount.amount;
}
}
}
private void OnItemAddedToContainer(ItemContainer container, Item item) {
if (container == null || item == null || !_wearItem.Contains(item.info.shortname)) return;
BasePlayer player = container.GetOwnerPlayer();
if (player == null || !player.userID.IsSteamId()) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
if (clan.SkinList.ContainsKey(item.info.shortname)) {
UInt64 skin = clan.SkinList[item.info.shortname];
if (skin != 0) {
if (item.info.category == ItemCategory.Attire) {
if (container == player.inventory.containerWear) ApplySkinToItem(item, skin);
}
else {
ApplySkinToItem(item, skin);
}
}
}
}
private void OnLootEntity(BasePlayer player, LootContainer entity) {
if (player == null || entity == null || entity.OwnerID.IsSteamId() || entity.net == null || _lootEntity.Contains(entity.net.ID.Value)) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
clan.GatherClan["loot-barrel"].Farm++;
clan.Members[player.userID].GatherMember["loot-barrel"]++;
clan.Members[player.userID].Point += GetPointConfig("loot-barrel");
_lootEntity.Add(entity.net.ID.Value);
}
private void OnEntityTakeDamage(PatrolHelicopter helicopter, HitInfo info) {
if (helicopter == null || helicopter.net == null || info == null || info.InitiatorPlayer == null) return;
_lastHeli[helicopter.net.ID.Value] = info.InitiatorPlayer;
}
private void OnEntityTakeDamage(BasePlayer player, HitInfo info) {
if (player == null || !player.userID.IsSteamId() || info == null) return;
BasePlayer initiatorPlayer = info.InitiatorPlayer;
if (initiatorPlayer == null || !initiatorPlayer.userID.IsSteamId() || player.userID == initiatorPlayer.userID) return;
ClanData clan = FindClanByUser(initiatorPlayer.userID);
if (clan == null) return;
Boolean friendlyFire = clan.Members[initiatorPlayer.userID].FriendlyFire;
if (!friendlyFire && clan.IsMember(player.userID)) {
if (initiatorPlayer.SecondsSinceAttacked > 5) {
initiatorPlayer.ChatMessage(GetLang("DAMAGE_FF_OFF", player.UserIDString));
initiatorPlayer.lastAttackedTime = UnityEngine.Time.time;
}
info.damageTypes.ScaleAll(0);
return;
}
}
private void OnPlayerDeath(BasePlayer player, HitInfo info) {
if (player == null || info == null || (player.ShortPrefabName == "player" && !player.userID.IsSteamId())) return;
if (info.damageTypes.Has(DamageType.Suicide)) {
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
clan.Members[player.userID].Death++;
clan.Members[player.userID].Point -= GetPointConfig("Suicide");
return;
}
BasePlayer attacker = info.InitiatorPlayer;
if (attacker == null || !attacker.userID.IsSteamId() || IsTeammates(player.userID, attacker.userID)) return;
if (player.userID.IsSteamId()) {
ClanData clan = FindClanByUser(player.userID);
if (clan != null) {
clan.Members[player.userID].Death++;
clan.Members[player.userID].Point -= GetPointConfig("Death");
}
ClanData clanAttacker = FindClanByUser(attacker.userID);
if (clanAttacker != null) {
clanAttacker.Members[attacker.userID].Kill++;
clanAttacker.Members[attacker.userID].Point += GetPointConfig("Kill");
}
}
}
private void OnEntityDeath(PatrolHelicopter entity, HitInfo info) {
if (entity == null || entity.net == null || info == null) return;
BasePlayer player;
if (_lastHeli.TryGetValue(entity.net.ID.Value, out player) && player != null) {
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
clan.Members[player.userID].Point += GetPointConfig("PatrolHelicopter");
foreach (BasePlayer onlinePlayer in BasePlayer.activePlayerList) onlinePlayer.ChatMessage(GetLang("PATROLHELICOPTER", onlinePlayer.UserIDString, clan.ClanTag));
}
}
private void OnEntityDeath(BaseCombatEntity entity, HitInfo info) {
if (entity == null || info == null) return;
BasePlayer player = info.InitiatorPlayer;
if (player == null) return;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return;
if (entity is BradleyAPC) {
clan.Members[player.userID].Point += GetPointConfig("BradleyAPC");
foreach (BasePlayer onlinePlayer in BasePlayer.activePlayerList) onlinePlayer.ChatMessage(GetLang("BRADLEYAPC", onlinePlayer.UserIDString, clan.ClanTag));
}
else if (entity.name.Contains("barrel")) {
clan.Members[player.userID].Point += GetPointConfig("loot-barrel");
clan.GatherClan["loot-barrel"].Farm++;
clan.Members[player.userID].GatherMember["loot-barrel"]++;
}
else if (entity.name.Contains("wall") && !entity.name.Contains("wall.external.high")) {
BuildingBlock buildingBlock = entity as BuildingBlock;
if (buildingBlock == null) return;
Int32 tier = (Int32)buildingBlock.grade;
if (tier <= 1) return;
if (tier == 2) clan.Members[player.userID].Point += GetPointConfig("WallTier2");
if (tier == 3) clan.Members[player.userID].Point += GetPointConfig("WallTier3");
if (tier == 4) clan.Members[player.userID].Point += GetPointConfig("WallTier4");
}
}
private object OnTeamCreate(BasePlayer player) {
if (player == null) return null;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) {
player.ChatMessage(GetLang("NO_CLAN", player.UserIDString));
return false;
}
return null;
}
private object OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player) {
if (team == null || player == null) return null;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return null;
if (clan.IsOwner(player.userID)) {
player.ChatMessage(GetLang("IS_LEADER", player.UserIDString));
return true;
}
clan.Kick(player.userID);
return null;
}
private object OnTeamKick(RelationshipManager.PlayerTeam team, BasePlayer player, UInt64 target) {
if (team == null || player == null) return null;
ClanData clan = FindClanByUser(player.userID);
if (clan == null) return null;
if (!clan.IsMember(target)) return false;
clan.Kick(target);
return null;
}
private object OnTeamInvite(BasePlayer inviter, BasePlayer target) {
if (inviter == null || target == null || !target.userID.IsSteamId()) return null;
if (_cooldownPlayer.ContainsKey(inviter.userID) && _cooldownPlayer[inviter.userID].Subtract(DateTime.Now).TotalSeconds >= 0) {
inviter.ChatMessage(GetLang("NO_FLOOD", inviter.UserIDString));
return false;
}
_cooldownPlayer[inviter.userID] = DateTime.Now.AddSeconds(2f);
SendInvite(inviter, target.userID);
return null;
}
private void OnTeamPromote(RelationshipManager.PlayerTeam team, BasePlayer newLeader) {
if (team == null || newLeader == null) return;
ClanData clan = FindClanByUser(team.teamLeader);
if (clan == null) return;
clan.SetLeader(newLeader.userID);
}
private object OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player) {
if (team == null || player == null) return null;
AcceptInvite(player);
return null;
}
private void OnTeamRejectInvite(BasePlayer player, RelationshipManager.PlayerTeam team) {
if (team == null || player == null) return;
Invite invite = _invites.Find(x => x.Recevier.userID == player.userID);
if (invite == null) {
player.ChatMessage(GetLang("NO_INVITE", player.UserIDString));
return;
}
player.ChatMessage(GetLang("CANCEL_INVITE", player.UserIDString));
invite.Inviter.ChatMessage(GetLang("INVITER_CANCEL_INVITE", invite.Inviter.UserIDString, player.IPlayer.Name));
_invites.Remove(invite);
}
#endregion
#region [Functional]
private void TimeHandle() {
foreach (BasePlayer player in BasePlayer.activePlayerList) {
ClanData clan = FindClanByUser(player.userID);
if (clan == null) continue;
clan.Members[player.userID].Online++;
}
}
private void RemoveInvite(String ClanTag, UInt64 playerID) {
Invite invite = _invites.Find(p => p.ClanTag == ClanTag && p.Recevier.userID == playerID);
if (invite == null) return;
invite.Recevier.ChatMessage(GetLang("NO_TIME", invite.Recevier.UserIDString));
invite.Recevier.ClearPendingInvite();
invite.Inviter.ChatMessage(GetLang("INVITER_NO_TIME", invite.Inviter.UserIDString, invite.Recevier.IPlayer.Name));
_invites.Remove(invite);
}
private void ApplySkinToItem(Item item, UInt64 Skin) {
item.skin = Skin;
item.MarkDirty();
BaseEntity heldEntity = item.GetHeldEntity();
if (heldEntity == null) return;
heldEntity.skinID = Skin;
heldEntity.SendNetworkUpdate();
}
private static void AuthCodeLock(UInt64 playerID, UInt64 friendID) {
foreach (CodeLock codeLock in _._codeLockList) {
if (playerID != codeLock.OwnerID || codeLock.whitelistPlayers.Contains(friendID)) continue;
codeLock.whitelistPlayers.Add(friendID);
codeLock.SendNetworkUpdate();
}
}
private static void DeAuthCodeLock(UInt64 playerID, UInt64 friendID) {
foreach (CodeLock codeLock in _._codeLockList) {
if (playerID != codeLock.OwnerID || !codeLock.whitelistPlayers.Contains(friendID)) continue;
codeLock.whitelistPlayers.Remove(friendID);
codeLock.SendNetworkUpdate();
}
}
private static void AuthBuilding(UInt64 playerID, UInt64 friendID) {
foreach (BuildingPrivlidge buildingPrivlidge in _._cupboardList) {
if (playerID != buildingPrivlidge.OwnerID) continue;
buildingPrivlidge.authorizedPlayers.RemoveWhere((ulong x) => x == friendID);
buildingPrivlidge.authorizedPlayers.Add(friendID);
buildingPrivlidge.SendNetworkUpdate();
}
}
private static void DeAuthBuilding(UInt64 playerID, UInt64 friendID) {
foreach (BuildingPrivlidge buildingPrivlidge in _._cupboardList) {
if (playerID != buildingPrivlidge.OwnerID) continue;
buildingPrivlidge.authorizedPlayers.RemoveWhere((ulong x) => x == friendID);
buildingPrivlidge.SendNetworkUpdate();
}
}
private static void ChangeOwnerIDForLeader(UInt64 playerID, UInt64 leaderID) {
foreach (BuildingPrivlidge buildingPrivlidge in _._cupboardList.Where(p => p.OwnerID == playerID)) {
buildingPrivlidge.OwnerID = leaderID;
buildingPrivlidge.SendNetworkUpdate();
}
foreach (CodeLock codeLock in _._codeLockList.Where(p => p.OwnerID == playerID)) {
codeLock.OwnerID = leaderID;
codeLock.SendNetworkUpdate();
}
foreach (SamSite samSite in _._sameSiteList.Where(p => p.OwnerID == playerID)) {
samSite.OwnerID = leaderID;
samSite.SendNetworkUpdate();
}
}
private Int32 GetPointConfig(String Name) {
if (_config.ScoreTable.ContainsKey(Name)) return _config.ScoreTable[Name];
return 0;
}
private Boolean IsTeammates(UInt64 player, UInt64 friend) {
return player == friend || RelationshipManager.ServerInstance.FindPlayersTeam(player)?.members?.Contains(friend) == true || FindClanByUser(player)?.IsMember(friend) == true;
}
Int32 GetClanIndex(String ClanTag) {
Int32 Top = 1;
IEnumerable<ClanData> clansList = _clansList.OrderByDescending(p => p.GetScore());
foreach (ClanData clan in clansList) {
if (clan.ClanTag == ClanTag) break;
Top++;
}
return Top;
}
public String FormatShortTime(TimeSpan time, String UserIDString) {
String result = String.Empty;
Boolean GetLanguage = lang.GetLanguage(UserIDString) == "ru";
if (time == new TimeSpan()) return "0 сек.";
if (time.Days != 0) result += $"{time.Days} {(GetLanguage ? "д." : "d.")} ";
if (time.Hours != 0) result += $"{time.Hours} {(GetLanguage ? "час." : "hour.")} ";
if (time.Minutes != 0) result += $"{time.Minutes} {(GetLanguage ? "мин." : "min.")} ";
if (time.Seconds != 0) result += $"{time.Seconds} {(GetLanguage ? "сек." : "sec.")} ";
return result;
}
private Int32 FindItemID(String shortName) {
Int32 val;
if (_itemIds.TryGetValue(shortName, out val)) return val;
ItemDefinition definition = ItemManager.FindItemDefinition(shortName);
if (definition == null) return 0;
val = definition.itemid;
_itemIds[shortName] = val;
return val;
}
private void GetAvatar(String userId, Action<String> callback) {
if (callback == null) return;
try {
webrequest.Enqueue($"http://steamcommunity.com/profiles/{userId}?xml=1", null, (code, response) => {
if (code != 200 || response == null) return;
String avatar = Regex.Match(response).Groups[1].ToString();
if (String.IsNullOrEmpty(avatar)) return;
callback.Invoke(avatar);
}
, this);
}
catch (Exception e) {
PrintError($"{e.Message}");
}
}
private void RewardClans() {
if (String.IsNullOrEmpty(_config.GameStoreSettings.ShopID) || String.IsNullOrEmpty(_config.GameStoreSettings.SecretKey) || String.IsNullOrEmpty(_config.GameStoreSettings.ServerID)) return;
StringBuilder text = new StringBuilder();
IEnumerable<ClanData> _clansReward = _clansList.OrderByDescending(x => x.GetScore());
Int32 i = 1;
foreach (ClanData clan in _clansReward) {
if (!_config.GameStoreSettings.RewardList.ContainsKey(i) || clan.GetScore() <= _config.GameStoreSettings.MinPoint) break;
Int32 Bonus = _config.GameStoreSettings.RewardList[i];
Double BonusPlayer = _config.GameStoreSettings.Prize ? Bonus / (Double)clan.Members.Count : Bonus;
text.Append(_config.GameStoreSettings.Prize ? $"{i}. {clan.ClanTag} received a {BonusPlayer} usd each." : $"{i}. {clan.ClanTag} получили по {BonusPlayer} руб.");
foreach (KeyValuePair<UInt64, ClanData.PlayerData> member in clan.Members) {
if (member.Value.Point <= _config.GameStoreSettings.MinPointPlayer) continue;
webrequest.Enqueue($"https://gamestores.app/api?shop_id={_config.GameStoreSettings.ShopID}&secret={_config.GameStoreSettings.SecretKey}&server={_config.GameStoreSettings.ServerID}&action=moneys&type=plus&steam_id={member.Key}&amount={BonusPlayer}&mess=Награда за клановый топ.", "", (code, response) => {
Puts(LanguageEn ? $"Player {member.Key} received: {BonusPlayer} units for the store" : $"Игроку {member.Key} получил: {BonusPlayer} единиц на магазин");
}
, this, Core.Libraries.RequestMethod.GET);
}
i++;
}
if (_config.DiscordSetting.DiscordNotificationEnable) {
DiscordMessage message = new DiscordMessage();
Embed embed = new Embed();
embed.AddTitle(LanguageEn ? "List of top clans by past wipe" : "Список топа кланов по прошедшему вайпу");
embed.AddDescription(text.ToString());
embed.AddColor("#de8732");
message.AddEmbed(embed);
SendDiscordMessage(_config.DiscordSetting.DiscordWebHook, message);
}
}
private void FillingTeams() {
if (_config.AutoTeamCreation) {
RelationshipManager.maxTeamSize = _config.LimitSettings.MemberLimit;
_clansList.ForEach(clan => {
clan.FindOrCreateTeam();
clan.Members.Keys.ToList().ForEach(member => clan.AddPlayer(member));
}
);
}
}
#endregion
#region [Interface]
[ChatCommand("ctop")]
void MainUi(BasePlayer player) {
CuiHelper.DestroyUi(player, Layer);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiElement {
Name = Layer, Parent = ".Mains", Components = {
new CuiRawImageComponent {
Png = _imageUI.GetImage("FON_CLAN_TOP")
}
, new CuiRectTransformComponent {
AnchorMin = "-0.315 -0.27", AnchorMax = "1.3 1.275", OffsetMax = "0 0"
}
,
}
}
);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.8 0.804", AnchorMax = "0.817 0.832"
}
, Button = {
Close = Layer, Command = "clan.closeui", Color = "0 0 0 0"
}
, Text = {
Text = ""
}
}
, Layer);
container.Add(new CuiButton {
RectTransform = {
AnchorMin = "0.326 0.74", AnchorMax = "0.4 0.778"
}
, Button = {
Command = "
// ... [Code preview truncated due to length. Full source in attached file] ...