using UnityEngine; using System.Collections.Generic; using Facepunch.Extend; using System.Collections; using Newtonsoft.Json; using System; using Facepunch; using Oxide.Core.Plugins; using Rust; using Newtonsoft.Json.Linq; using Oxide.Game.Rust; using System.Linq; using Oxide.Game.Rust.Cui; namespace Oxide.Plugins { [Info("TurretsReborn", "Mrdecoder & 0xf", "1.0.7")] [Description("Gives players extra turret and sam options")] class TurretsReborn : RustPlugin { [PluginReference] private Plugin Clans; public Dictionary SamToggle = new Dictionary(); [ConsoleCommand("closeturret")] private void cmdCloseGUITurrets(ConsoleSystem.Arg args) { BasePlayer player = args.Player(); //player.SendConsoleCommand(args.Args[0].Replace("'", string.Empty)); CuiHelper.DestroyUi(player, ".TurretsGUI"); } [ChatCommand("turretmenu")] void cmdTurrets(BasePlayer player, string cmd, string[] args) { //Effect x = new Effect("assets/bundled/prefabs/fx/notice/loot.drag.grab.fx.prefab", player, 0, new Vector3(), new Vector3()); GUITurrets(player); // EffectNetwork.Send(x, player.Connection); //return; } private void GUITurrets(BasePlayer player) { //CuiHelper.DestroyUi(player, ".LogoGUI"); CuiElementContainer container = new CuiElementContainer(); //MenuConfig.LogoSetting logo = config.Logo; container.Add(new CuiPanel { RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-100 -100", OffsetMax = "100 100" }, Image = { Color = "1 1 1 1" }, CursorEnabled = true }, "Hud.Menu", ".TurretsGUI"); container.Add(new CuiButton { RectTransform = { AnchorMin = "1 1", AnchorMax = "1 1", OffsetMin = "-22.5 -22", OffsetMax = "-2 -2" }, Button = { Color = "0 1 0 1", Close = ".TurretsGUI", Command = "global.closeturret" }, Text = { Text = "✘", Align = TextAnchor.MiddleCenter, FontSize = 13, Color = "1 1 1 0.6" } }, ".TurretsGUI"); CuiHelper.AddUi(player, container); } [ChatCommand("turrets")] void RunTurretCommand(BasePlayer player, string command, string[] args) { var MessageChat = new System.Text.StringBuilder(); if (args.Length == 1 && args[0] == "info" && !player.IPlayer.HasPermission(SimpleTurrets)) { MessageChat.Append("No permissions have been set!"); } else if (args.Length == 1 && args[0] == "info") { MessageChat.Append("-----------------\nTurrets REBORN\n-----------------\nAvailable Commands:\n"); MessageChat.Append("/turret - Will toggle the turret you looking at\n"); MessageChat.Append("/turret on - Will put the turret you looking at on\n"); MessageChat.Append("/turret off - Will put the turret you looking at off\n\n"); if (player.IPlayer.HasPermission(MainTurrets) || player.IPlayer.HasPermission(ShowVipTurrets)) { MessageChat.Append("/turrets - Will toggle all turrets\n"); MessageChat.Append("/turrets on - Will put all turrets in range of TC on\n"); MessageChat.Append("/turrets off - Will put all turrets in range of TC off\n\n"); } if (player.IPlayer.HasPermission(ExtraTurrets) || player.IPlayer.HasPermission(ShowVipTurrets)) { MessageChat.Append("Extra options:\n"); MessageChat.Append("/turrets fill - Fills all turrets with the default 5.56 rifle bullets\n"); MessageChat.Append("/turrets fill - Fills all turrets with the specified ammo type\n"); MessageChat.Append("/turrets fill - Fills all empty turrets with the specified gun\n"); MessageChat.Append("/turrets clear ammo - Clears all types of ammo from turrets and gives it back to inventory\n"); MessageChat.Append("/turrets clear guns - Clears all types of guns and gives it back to inventory\n"); MessageChat.Append("/turrets clear guns - Clears all turrets of the specified gun and gives it back to inventory\n\n"); MessageChat.Append("/sams - Turns all sams off, if run again turns all sams on\n"); MessageChat.Append("/sams clear - Clears sam bullets and gives it back to inventory\n"); MessageChat.Append("/sams fill - Fills sams with bullets\n\n"); MessageChat.Append("/traps fill - Fills Shotgun Traps with handmade shells\n"); MessageChat.Append("/traps clear - Clears Shotgun Traps shells and gives it back to inventory\n\n"); MessageChat.Append("Guns:\nak47, python, bolt, custom, db, l96, lr, m249, lmg, m39, m92, mp5, pump, revolver, eoka, p2, thompson, waterpipe, spas, semi, grenadelauncher, rocketlauncher\n"); MessageChat.Append("Ammo:\nincen, 556, hv, rocket, hvrocket, incenrocket, pistol, pistolhv, pistolincen, buckshot, slug, buckshotincen, handmade, he, smoke, buckshotgrenade\n\n"); MessageChat.Append("Made by MrDecoder"); } } else if (!player.IPlayer.HasPermission(MainTurrets)) { MessageChat.Append("You dont have permission to use /turrets\ntype /turrets info for more info"); } if (player.IsBuildingAuthed()) { if (!player.IPlayer.HasPermission(MainTurrets)) { player.ChatMessage("you dont have permission to use that command"); return; } if (args.Length == 1 && args[0] == "on") { ServerMgr.Instance.StartCoroutine(AutoPower(true, player, false)); } if (args.Length == 1 && args[0] == "off") { ServerMgr.Instance.StartCoroutine(AutoPower(false, player, false)); } if (args.Length == 0) { ServerMgr.Instance.StartCoroutine(AutoPower(true, player, true)); return; } if (!player.IPlayer.HasPermission(ExtraTurrets)) { player.ChatMessage("you dont have permission to use that command"); return; } if (args[0] == "clear") { if (!player.IPlayer.HasPermission(ExtraTurrets)) { MessageChat.Append("You dont have permission to use /turrets clear"); } else { if (args.Length != 2) { if (args.Length != 3) { player.ChatMessage("syntax error, proper format -- " + "/turrets clear ammo " + "or " + "/turrets clear guns"); return; } } if (args[1] == "guns") { if (args.Length == 3 && PossibleGuns.Contains(args[2])) { EmptyTurretsGun(player, GunType(args[2]), true); return; } EmptyTurretsGun(player, "null", false); return; } else { if (args[1] == "ammo") { EmptyTurrets(player); return; } } player.ChatMessage("syntax error, proper format -- " + "/turrets clear ammo " + "or " + "/turrets clear guns"); return; } } if (args[0] == "fill") { if (!player.IPlayer.HasPermission(ExtraTurrets)) { MessageChat.Append("You dont have permission to use /turrets fill"); } else { string shortname = GunType(args[1]); var def = ItemManager.FindItemDefinition(shortname); if (PossibleGuns.Contains(args[1])) { if (config.weapons.Contains(shortname)) { perm = Name + "."; if (permission.UserHasPermission(player.UserIDString, perm + shortname)) { //player.ChatMessage("permission yes"); FillGunTurrets(player, GunType(args[1]), args[1]); } else { player.ChatMessage($"You dont have permission to use fill {def.displayName.english}"); } return; } else { FillGunTurrets(player, GunType(args[1]), args[1]); return; } } else if (args.Length == 3) { if (PossibleAmmo.Contains(args[2])) { FillTurrets(player, args[1], AmmoType(args[2])); return; } player.ChatMessage("invalid ammo type -- incen, hv, 556, pistol, pistolhv, pistolincen, rocket, rockethv, rocketincen, buckshot, buckshotincen, slug, he, smoke, handmade, buckshot grenade"); return; } else { FillTurrets(player, args[1], "ammo.rifle"); } /* //BasePlayer player = item.GetOwnerPlayer(); if (player == null) return ItemContainer.CanAcceptResult.CannotAccept; if (!permission.UserHasPermission(player.UserIDString, perm + item.info.shortname)) { player.ChatMessage($"You dont have permission to use {item.info.displayName.english}"); return ItemContainer.CanAcceptResult.CannotAccept; } */ /* player.ChatMessage($"{shortname}"); if (!player.IPlayer.HasPermission(shortname) && config.weapons.Contains(shortname)) { player.ChatMessage($"You dont have permission to use fill {def.displayName.english}"); return; } if (args.Length == 1) { player.ChatMessage("syntax error, proper format -- /turrets fill 50 \n or /turrets fill ak47"); return; } if (PossibleGuns.Contains(args[1])) { ServerMgr.Instance.StartCoroutine(FillGunTurrets(player, GunType(args[1]), args[1])); return; } if (args.Length == 3) { if (PossibleAmmo.Contains(args[2])) { ServerMgr.Instance.StartCoroutine(FillTurrets(player, args[1], AmmoType(args[2]))); return; } player.ChatMessage("invalid ammo type -- incen, hv, 556, pistol, pistolhv, pistolincen, rocket, rockethv, rocketincen, buckshot, buckshotincen, slug, he, smoke, handmade, buckshot grenade"); return; } ServerMgr.Instance.StartCoroutine(FillTurrets(player, args[1], "ammo.rifle")); */ } } } else if (args.Length == 1 && args[0] == "info") { } else { player.ChatMessage("You have to be in range of your tool cupboards to use this command\nFor more info /turrets info"); return; } player.ChatMessage(MessageChat.ToString()); return; } LayerMask layers = LayerMask.GetMask("Deployed"); [ChatCommand("turret")] void SingleTurret(BasePlayer player) { if (!player.IPlayer.HasPermission(SimpleTurrets)) { player.ChatMessage("you dont have permission to use that"); return; } if (!player.IsBuildingAuthed()) { player.ChatMessage("you have to be in range of your tool cupboards to use this command"); return; } RaycastHit hit; bool flag1 = Physics.Raycast(player.eyes.HeadRay(), out hit, 20f, layers); BaseEntity entity = flag1 ? hit.GetEntity() : null; if (entity == null) { player.ChatMessage("you are not looking at a turret"); return; } Effect Oneffect = new Effect("assets/prefabs/npc/autoturret/effects/online.prefab", entity, 0, Vector3.zero, Vector3.forward); Effect Offeffect = new Effect("assets/prefabs/npc/autoturret/effects/offline.prefab", entity, 0, Vector3.zero, Vector3.forward); if (entity is AutoTurret) { var turret = entity.GetComponent(); if (!turret.IsOnline()) { turret.SetIsOnline(true); turret.InitiateStartup(); entity.SendNetworkUpdate(); EffectNetwork.Send(Oneffect, player.net.connection); } else { turret.SetIsOnline(false); turret.InitiateShutdown(); entity.SendNetworkUpdate(); EffectNetwork.Send(Offeffect, player.net.connection); } } } [ChatCommand("sams")] void PowerSams(BasePlayer player, string command, string[] args) { if (!player.IsBuildingAuthed()) { player.ChatMessage("you have to be in range of your tool cupboards to use this command"); return; } if (args.Length == 1 && args[0] == "on") { ServerMgr.Instance.StartCoroutine(SamPower(true, player)); return; } if (args.Length == 1 && args[0] == "off") { ServerMgr.Instance.StartCoroutine(SamPower(false, player)); return; } if (args.Length == 2 && args[0] == "fill") { SamAmmoAdd(player, args[1]); return; } if (args.Length == 1 && args[0] == "clear") { SamAmmoClear(player); return; } if (SamToggle.ContainsKey(player.userID)) { ServerMgr.Instance.StartCoroutine(SamPower(true, player)); SamToggle.Remove(player.userID); } else { ServerMgr.Instance.StartCoroutine(SamPower(false, player)); SamToggle.Add(player.userID, true); } } [ChatCommand("traps")] void filltraps(BasePlayer player, string command, string[] args) { if (!player.IsBuildingAuthed()) { player.ChatMessage("you have to be in range of your tool cupboards to use this command"); return; } if (args.Length == 2 && args[0] == "fill") { TrapAmmoAdd(player, args[1]); return; } if (args.Length == 1 && args[0] == "clear") { TrapAmmoClear(player); return; } } #region Turret Ammo Filler void FillContainers(BasePlayer player, int itemid, int amountForEach, int targetSlot = -1, Func predicate = null, Action fillCallback = null, Action successCallback = null, Action invalidErrorCallback = null, Action entitiesCountErrorCallback = null, Action notEnoughErrorCallback = null) where T : BaseEntity, IItemContainerEntity { if (player == null || itemid == 0 || amountForEach <= 0) { if (invalidErrorCallback != null) invalidErrorCallback(); return; } ulong id = player.userID; var list = FindEntities(player.transform.position, config.Radius, predicate); int EntitiesCount = list.Count(); if (EntitiesCount == 0) { if (entitiesCountErrorCallback != null) entitiesCountErrorCallback(); return; } List foundedItems = new List(); List allItems = new List(); allItems.AddRange(player.inventory.containerMain.itemList); allItems.AddRange(player.inventory.containerWear.itemList); allItems.AddRange(player.inventory.containerBelt.itemList); foreach (Item item in allItems) { if (item.info.itemid == itemid) { foundedItems.Add(item); } } int foundedItemsAmount = foundedItems.Sum(item => item.amount); int AmountToLose = EntitiesCount * amountForEach; if (foundedItemsAmount < AmountToLose) { if (notEnoughErrorCallback != null) notEnoughErrorCallback(AmountToLose); return; } var filledAmount = 0; foreach (T container in list) { int needsToMove = amountForEach; for (int i = 0; i < foundedItems.Count; i++) { if (needsToMove <= 0) break; Item item = foundedItems[i]; if (item == null) continue; if (item.amount > amountForEach) { if (item.SplitItem(amountForEach).MoveToContainer(container.inventory, targetSlot)) break; } else { int itemAmount = item.amount; if (item.MoveToContainer(container.inventory, targetSlot)) needsToMove -= itemAmount; foundedItems[i] = null; } } if (fillCallback != null) fillCallback(container); filledAmount++; } if (successCallback != null) successCallback(filledAmount); return; } void FillTurrets(BasePlayer player, string UserInput, string AmmoType) { int AmountForEach; if (!int.TryParse(UserInput, out AmountForEach) || AmountForEach == 0) return; ItemDefinition ammoDef = ItemManager.FindItemDefinition(AmmoType); if (ammoDef == null) return; ulong id = player.userID; FillContainers(player, ammoDef.itemid, AmountForEach, predicate: turret => ((player.Team == null && turret.OwnerID == id) || IsFriends(player, turret.OwnerID) || InSameClan(player.userID, turret.OwnerID)) && turret.inventory.GetSlot(0) != null && turret.GetValidAmmoTypes().HasFlag(UserAmmoType(AmmoType)), fillCallback: turret => { turret.UpdateTotalAmmo(); turret.EnsureReloaded(false); turret.UpdateTotalAmmo(); }, successCallback: amount => player.ChatMessage($"{amount}" + " turrets have been filled with " + $"{UserInput}" + " bullets"), invalidErrorCallback: () => player.ChatMessage("Invalid args passed to the function"), entitiesCountErrorCallback: () => player.ChatMessage("No suitable turrets were found. There should be weapons in the turrets."), notEnoughErrorCallback: needsAmount => player.ChatMessage("you dont have enough ammo, you need " + $"{needsAmount}" + " bullets")); return; } #endregion #region Turret Ammo Clearer public void EmptyTurrets(BasePlayer player) { ulong id = player.userID; var list = FindEntities(player.transform.position, config.Radius, turret => (player.Team == null && turret.OwnerID == player.userID) || IsFriends(player, turret.OwnerID) || InSameClan(player.userID, turret.OwnerID)); int unloadCount = 0; foreach (AutoTurret turret in list) { List items = new List(turret.inventory.itemList); foreach (var item in items) { if (item.position == 0) continue; if (!item.MoveToContainer(player.inventory.containerMain, -1, true, false, null, true) && !item.MoveToContainer(player.inventory.containerBelt, -1, true, false, null, true)) goto exit; } unloadCount++; } exit: player.ChatMessage($"{unloadCount}" + " Turrets have been cleared of ammo and moved to your inventory "); return; } #endregion #region Turret Gun Filler public void FillGunTurrets(BasePlayer player, string UserInput, string GunName) { ItemDefinition ammoDef = ItemManager.FindItemDefinition(UserInput); if (ammoDef == null) return; ulong id = player.userID; FillContainers(player, ammoDef.itemid, 1, targetSlot: 0, predicate: turret => turret.ShortPrefabName != "sentry.scientist.static" && ((player.Team == null && turret.OwnerID == id) || IsFriends(player, turret.OwnerID) || InSameClan(player.userID, turret.OwnerID) && turret.GetSlot(0) == null), fillCallback: turret => { turret.UpdateAttachedWeapon(); turret.inventory.MarkDirty(); turret.SendNetworkUpdate(); }, successCallback: amount => player.ChatMessage($"{amount}" + " turrets have been filled with " + $"{GunName}"), invalidErrorCallback: () => player.ChatMessage("Invalid args passed to the function"), entitiesCountErrorCallback: () => player.ChatMessage("No suitable turrets were found."), notEnoughErrorCallback: needsAmount => player.ChatMessage("you dont have enough " + $"{GunName}'s, " + "you need " + $"{needsAmount}")); return; } #endregion #region Turret Gun Clearer public void EmptyTurretsGun(BasePlayer player, string UserInput, bool GunType) { ulong id = player.userID; var list = FindEntities(player.transform.position, config.Radius, turret => (player.Team == null && turret.OwnerID == player.userID) || IsFriends(player, turret.OwnerID) || InSameClan(player.userID, turret.OwnerID) && turret.ShortPrefabName != "sentry.scientist.static" && turret.AttachedWeapon != null); int unloadCount = 0; foreach (AutoTurret turret in list) { var item = turret.inventory.GetSlot(0); if (!item.MoveToContainer(player.inventory.containerMain, -1, true, false, null, true) && !item.MoveToContainer(player.inventory.containerBelt, -1, true, false, null, true)) goto exit; else unloadCount++; } exit: player.ChatMessage($"{unloadCount}" + " turrets have been cleared of guns and moved to your inventory "); return; } #endregion #region autopower public IEnumerator AutoPower(bool IsOn, BasePlayer player, bool Powered) { int TurretAmount = 0; var list = FindEntities(player.transform.position, config.Radius); foreach (AutoTurret turret in list) { Effect Oneffect = new Effect("assets/prefabs/npc/autoturret/effects/online.prefab", turret, 0, Vector3.zero, Vector3.forward); Effect Offeffect = new Effect("assets/prefabs/npc/autoturret/effects/offline.prefab", turret, 0, Vector3.zero, Vector3.forward); if ((player.Team == null && turret.OwnerID == player.userID) || IsFriends(player, turret.OwnerID) || InSameClan(player.userID, turret.OwnerID)) { if (Powered) { if (turret.IsOnline()) { IsOn = false; } else { IsOn = true; } } if (IsOn) { if (!turret.IsOnline()) { TurretAmount++; turret.SetIsOnline(true); turret.InitiateStartup(); turret.SendNetworkUpdate(); EffectNetwork.Send(Oneffect, player.net.connection); } } else { if (turret.IsOnline()) { TurretAmount++; turret.SetIsOnline(false); turret.InitiateShutdown(); turret.SendNetworkUpdate(); EffectNetwork.Send(Offeffect, player.net.connection); } } } } if (Powered) { player.ChatMessage($"{TurretAmount}" + " turrets have been toggled "); } else { if (IsOn) { player.ChatMessage($"{TurretAmount}" + " turrets have been turned on "); } else { player.ChatMessage($"{TurretAmount}" + " turrets have been turned off "); } } yield return null; } #endregion #region SamSites public IEnumerator SamPower(bool IsOn, BasePlayer player) { var list = FindEntities(player.transform.position, config.Radius, sam => (player.Team == null && sam.OwnerID == player.userID) || IsFriends(player, sam.OwnerID) || InSameClan(player.userID, sam.OwnerID)); int SamAmount = list.Count; foreach (SamSite entity in list) { if (IsOn) { entity.UpdateHasPower(9999, 0); entity.SendNetworkUpdate(); } else { entity.UpdateHasPower(0, 0); entity.SendNetworkUpdate(); } } if (IsOn) { player.ChatMessage($"{SamAmount}" + " SamSites have been turned on "); } else { player.ChatMessage($"{SamAmount}" + " SamSites have been turned off "); } yield return null; } void OnEntityBuilt(Planner plan, GameObject go) { var entity = go.gameObject.ToBaseEntity(); if (entity is SamSite) { var sam = entity.GetComponent(); sam.UpdateHasPower(9999, 0); } } #endregion #region Sams Clearer public void SamAmmoClear(BasePlayer player) { ulong id = player.userID; var list = FindEntities(player.transform.position, config.Radius, sam => (player.Team == null && sam.OwnerID == player.userID) || IsFriends(player, sam.OwnerID) || InSameClan(player.userID, sam.OwnerID)); int unloadCount = 0; foreach (SamSite sam in list) { List items = new List(sam.inventory.itemList); foreach (var item in items) { if (!item.MoveToContainer(player.inventory.containerMain, -1, true, false, null, true) && !item.MoveToContainer(player.inventory.containerBelt, -1, true, false, null, true)) goto exit; else unloadCount++; } } exit: player.ChatMessage($"{unloadCount}" + " SamSites have been cleared of ammo and moved to your inventory "); return; } public void SamAmmoAdd(BasePlayer player, string UserInput) { int AmountForEach; if (!int.TryParse(UserInput, out AmountForEach) || AmountForEach == 0) return; ItemDefinition ammoDef = ItemManager.FindItemDefinition("ammo.rocket.sam"); if (ammoDef == null) return; ulong id = player.userID; FillContainers(player, ammoDef.itemid, AmountForEach, predicate: sam => (player.Team == null && sam.OwnerID == player.userID) || IsFriends(player, sam.OwnerID), fillCallback: sam => sam.SendNetworkUpdate(), successCallback: amount => player.ChatMessage($"{amount}" + " SamSites have been filled with " + $"{UserInput}" + " rockets"), invalidErrorCallback: () => player.ChatMessage("Invalid args passed to the function"), entitiesCountErrorCallback: () => player.ChatMessage("No suitable sams were found."), notEnoughErrorCallback: needsAmount => player.ChatMessage("you dont have enough rockets, you need " + $"{needsAmount}" + " sam rockets")); return; } #endregion #region Traps Clearer public void TrapAmmoClear(BasePlayer player) { ulong id = player.userID; var list = FindEntities(player.transform.position, config.Radius, trap => (player.Team == null && trap.OwnerID == player.userID) || IsFriends(player, trap.OwnerID) || InSameClan(player.userID, trap.OwnerID)); int unloadCount = 0; foreach (GunTrap trap in list) { List items = new List(trap.inventory.itemList); foreach (var item in items) { if (!item.MoveToContainer(player.inventory.containerMain, -1, true, false, null, true) && !item.MoveToContainer(player.inventory.containerBelt, -1, true, false, null, true)) goto exit; } unloadCount++; } exit: player.ChatMessage($"{unloadCount}" + " Shotgun traps have been cleared of ammo and moved to your inventory "); return; } public void TrapAmmoAdd(BasePlayer player, string UserInput) { int AmountForEach; if (!int.TryParse(UserInput, out AmountForEach) || AmountForEach == 0) return; ItemDefinition ammoDef = ItemManager.FindItemDefinition("ammo.handmade.shell"); if (ammoDef == null) return; ulong id = player.userID; FillContainers(player, ammoDef.itemid, AmountForEach, predicate: trap => (((player.Team == null && trap.OwnerID == player.userID) || IsFriends(player, trap.OwnerID))), fillCallback: trap => trap.SendNetworkUpdate(), successCallback: amount => player.ChatMessage($"{amount}" + " Shotgun Traps have been filled with " + $"{UserInput}" + " bullets"), invalidErrorCallback: () => player.ChatMessage("Invalid args passed to the function"), entitiesCountErrorCallback: () => player.ChatMessage("No suitable traps were found."), notEnoughErrorCallback: needsAmount => player.ChatMessage("you dont have enough ammo, you need " + $"{needsAmount}" + " bullets")); return; } #endregion #region helpers private const string ShowVipTurrets = "TurretsReborn.showvipinfo"; private const string ExtraTurrets = "TurretsReborn.extra"; private const string MainTurrets = "TurretsReborn.turrets"; private const string SimpleTurrets = "TurretsReborn.normal"; private const string AllowRocket = "TurretsReborn.AllowRocket"; private const string AllowGrenade = "TurretsReborn.AllowGrenade"; void Init() { // permission.RegisterPermission(AllowRocket, this); // permission.RegisterPermission(AllowGrenade, this); permission.RegisterPermission(ShowVipTurrets, this); permission.RegisterPermission(ExtraTurrets, this); permission.RegisterPermission(MainTurrets, this); permission.RegisterPermission(SimpleTurrets, this); } #region Clans Support private string GetPlayerClan(BasePlayer player) { return Clans?.Call("GetClanOf", player.userID); } private string GetPlayerClan(ulong playerID) { return Clans?.Call("GetClanOf", playerID); } private string GetPlayerClan(string playerID) { return Clans?.Call("GetClanOf", playerID); } private bool InSameClan(ulong player1, ulong player2) { var clan1 = GetPlayerClan(player1); var clan2 = GetPlayerClan(player2); return string.IsNullOrEmpty(clan1) == false && string.Equals(clan1, clan2); } private bool InSameClan(BasePlayer player1, ulong player2) { var clan1 = GetPlayerClan(player1); var clan2 = GetPlayerClan(player2); return string.IsNullOrEmpty(clan1) == false && string.Equals(clan1, clan2); } private bool InSameClan(ulong player1, BasePlayer player2) { var clan1 = GetPlayerClan(player1); var clan2 = GetPlayerClan(player2); return string.IsNullOrEmpty(clan1) == false && string.Equals(clan1, clan2); } #endregion bool IsFriends(BasePlayer player, BasePlayer player2) { if (player == null || player2 == null || player.Team == null) return false; return player.Team.members.Contains(player.userID); } bool IsFriends(BasePlayer player, ulong player2userId) { if (player == null || player2userId == 0UL) return false; return player.userID == player2userId || player.Team?.members.Contains(player2userId) == true; } List FindEntities(Vector3 position, float distance) where T : BaseEntity { var list = Pool.GetList(); Vis.Entities(position, distance, list, layers); var distinctedList = list.Distinct().ToList(); Pool.FreeList(ref list); return distinctedList; } List FindEntities(Vector3 position, float distance, Func predicate) where T : BaseEntity { if (predicate == null) return FindEntities(position, distance); var list = Pool.GetList(); Vis.Entities(position, distance, list, layers); var distinctedList = list.Distinct().Where(predicate).ToList(); Pool.FreeList(ref list); return distinctedList; } public HashSet Ammo = new HashSet() { -1211166256, 605467368, 1712070256, -742865266, 1638322904, -1841918730, 785728077, 51984655, -1691396643, -1036635990, -727717969, 588596902, 349762871, 915408809, 1055319033 }; string GunType(string h) { switch (h) { case "ak47": return "rifle.ak"; case "python": return "pistol.python"; case "bolt": return "rifle.bolt"; case "custom": return "smg.2"; case "db": return "shotgun.double"; case "l96": return "rifle.l96"; case "lr": return "rifle.lr300"; case "m249": return "lmg.m249"; case "lmg": return "hmlmg"; case "m39": return "rifle.m39"; case "m92": return "pistol.m92"; case "mp5": return "smg.mp5"; case "pump": return "shotgun.pump"; case "revolver": return "pistol.revolver"; case "p2": return "pistol.semiauto"; case "thompson": return "smg.thompson"; case "waterpipe": return "shotgun.waterpipe"; case "spas": return "shotgun.spas12"; case "semi": return "rifle.semiauto"; case "grenadelauncher": return "multiplegrenadelauncher"; case "rocketlauncher": return "rocket.launcher"; case "eoka": return "pistol.eoka"; default: return ""; } } AmmoTypes ValidAmmo(string h) { switch (h) { case "rifle.ak": return AmmoTypes.RIFLE_556MM; case "pistol.python": return AmmoTypes.PISTOL_9MM; case "rifle.bolt": return AmmoTypes.RIFLE_556MM; case "smg.2": return AmmoTypes.PISTOL_9MM; case "shotgun.double": return AmmoTypes.SHOTGUN_12GUAGE; case "rifle.l96": return AmmoTypes.RIFLE_556MM; case "rifle.lr300": return AmmoTypes.RIFLE_556MM; case "lmg.m249": return AmmoTypes.RIFLE_556MM; case "hmlmg": return AmmoTypes.RIFLE_556MM; case "rifle.m39": return AmmoTypes.RIFLE_556MM; case "pistol.m92": return AmmoTypes.PISTOL_9MM; case "smg.mp5": return AmmoTypes.PISTOL_9MM; case "shotgun.pump": return AmmoTypes.SHOTGUN_12GUAGE; case "pistol.revolver": return AmmoTypes.PISTOL_9MM; case "pistol.semiauto": return AmmoTypes.PISTOL_9MM; case "smg.thompson": return AmmoTypes.PISTOL_9MM; case "shotgun.waterpipe": return AmmoTypes.SHOTGUN_12GUAGE; case "shotgun.spas12": return AmmoTypes.SHOTGUN_12GUAGE; case "rifle.semiauto": return AmmoTypes.RIFLE_556MM; case "multiplegrenadelauncher": return AmmoTypes.AMMO_40MM; case "rocket.launcher": return AmmoTypes.ROCKET; case "pistol.eoka": return AmmoTypes.SHOTGUN_12GUAGE; default: return AmmoTypes.RIFLE_556MM; } } public HashSet PossibleGuns = new HashSet { "ak47", "python", "bolt", "custom", "db", "l96", "lr", "m249", "lmg", "m39", "m92", "mp5", "pump", "revolver", "p2", "thompson", "waterpipe", "spas", "semi", "grenadelauncher", "rocketlauncher", "eoka" }; string AmmoType(string h) { switch (h) { case "incen": return "ammo.rifle.incendiary"; case "55.6": return "ammo.rifle"; case "hv": return "ammo.rifle.hv"; case "rocket": return "ammo.rocket.basic"; case "hvrocket": return "ammo.rocket.hv"; case "incenrocket": return "ammo.rocket.fire"; case "pistol": return "ammo.pistol"; case "pistolhv": return "ammo.pistol.hv"; case "pistolincen": return "ammo.pistol.fire"; case "buckshot": return "ammo.shotgun"; case "slug": return "ammo.shotgun.slug"; case "buckshotincen": return "ammo.shotgun.fire"; case "handmade": return "ammo.handmade.shell"; case "he": return "ammo.grenadelauncher.he"; case "smoke": return "ammo.grenadelauncher.smoke"; case "buckshotgrenade": return "ammo.grenadelauncher.buckshot"; default: return ""; } } AmmoTypes UserAmmoType(string h) { switch (h) { case "ammo.rifle.incendiary": return AmmoTypes.RIFLE_556MM; case "ammo.rifle": return AmmoTypes.RIFLE_556MM; case "ammo.rifle.hv": return AmmoTypes.RIFLE_556MM; case "ammo.rocket.basic": return AmmoTypes.ROCKET; case "ammo.rocket.hv": return AmmoTypes.ROCKET; case "ammo.rocket.fire": return AmmoTypes.ROCKET; case "ammo.pistol": return AmmoTypes.PISTOL_9MM; case "ammo.pistol.hv": return AmmoTypes.PISTOL_9MM; case "ammo.pistol.fire": return AmmoTypes.PISTOL_9MM; case "ammo.shotgun": return AmmoTypes.SHOTGUN_12GUAGE; case "ammo.shotgun.slug": return AmmoTypes.SHOTGUN_12GUAGE; case "ammo.shotgun.fire": return AmmoTypes.SHOTGUN_12GUAGE; case "ammo.handmade.shell": return AmmoTypes.SHOTGUN_12GUAGE; case "ammo.grenadelauncher.he": return AmmoTypes.AMMO_40MM; case "ammo.grenadelauncher.smoke": return AmmoTypes.AMMO_40MM; case "ammo.grenadelauncher.buckshot": return AmmoTypes.AMMO_40MM; default: return AmmoTypes.RIFLE_556MM; } } public HashSet PossibleAmmo = new HashSet { "incen", "556", "hv", "rocket", "hvrocket", "incenrocket", "pistol", "pistolhv", "pistolincen", "buckshot", "slug", "buckshotincen", "handmade", "he", "smoke", "buckshotgrenade" }; #endregion #region config private Configuration config; protected override void LoadDefaultConfig() { config = Configuration.DefaultConfig(); } protected override void LoadConfig() { base.LoadConfig(); try { config = Config.ReadObject(); if (config == null) throw new Exception(); SaveConfig(); } catch { PrintError("Your configuration file contains an error. Using default configuration values."); LoadDefaultConfig(); } } protected override void SaveConfig() { Config.WriteObject(config); } public class Configuration { [JsonProperty(PropertyName = "radius")] public float Radius = 300f; // [JsonProperty(PropertyName = "Weapons Allowed", ObjectCreationHandling = ObjectCreationHandling.Replace)] public Dictionary Weapons = new Dictionary(); [JsonProperty("Block weapons in turrets by permission")] public List weapons = new List(); public static Configuration DefaultConfig() { return new Configuration() { weapons = new List { "multiplegrenadelauncher", "rocket.launcher" } }; } } // protected override void SaveConfig() => Config.WriteObject(config); // protected override void LoadDefaultConfig() => config = new Configuration(); #endregion #region Remove Turret Restrictions string perm; private void OnServerInitialized() { perm = Name + "."; foreach (var item in ItemManager.itemList) { var proj = item.GetComponent()?.entityPrefab?.Get()?.GetComponent(); if (proj != null) proj.usableByTurret = true; } foreach (var x in config.weapons) permission.RegisterPermission(perm + x, this); /* foreach (var item in ItemManager.itemList) { var proj = item.GetComponent()?.entityPrefab?.Get()?.GetComponent(); if (proj != null) { proj.usableByTurret = false; proj.usableByTurret = true; } } */ foreach (var entity in BaseNetworkable.serverEntities) { if (entity is HeldEntity) OnEntitySpawned(entity as HeldEntity); } } ItemContainer.CanAcceptResult? CanAcceptItem(ItemContainer container, Item item, int targetPos) { if (container.entityOwner != null && container.entityOwner is AutoTurret) { BasePlayer player = item.GetOwnerPlayer(); perm = Name + "."; if (player == null) return ItemContainer.CanAcceptResult.CanAccept; if (config.weapons.Contains(item.info.shortname)) { if (!permission.UserHasPermission(player.UserIDString, perm + item.info.shortname)) { //player.ChatMessage($"{perm}"); player.ChatMessage($"You dont have permission to use {item.info.displayName.english}"); return ItemContainer.CanAcceptResult.CannotAccept; } } //return null; } return null; } /* { // if (container.entityOwner != null && container.entityOwner is AutoTurret) // { if (config.weapons.Contains(item.info.shortname)) { BasePlayer player = item.GetOwnerPlayer(); if (player == null) return ItemContainer.CanAcceptResult.CannotAccept; if (!permission.UserHasPermission(player.UserIDString, perm + item.info.shortname)) { player.ChatMessage($"You dont have permission to use {item.info.displayName.english}"); return ItemContainer.CanAcceptResult.CannotAccept; } } // } return null; } */ private void OnEntitySpawned(HeldEntity entity) { var proj = entity.GetComponent(); if (proj == null) return; proj.usableByTurret = true; } #endregion } }