Brandan

Rust Plugin - Protect Decay Zones (CLANS)

Dec 8th, 2016
225
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Author:     Brandan Lasley
  3.     Date:       12/8/2016
  4.     Purpose:    Manages custom zones in rust which can prevent decay for certain users.
  5.     File:       ProtectedDecayZones.cs
  6.     Version:    1.0.1
  7.  
  8.     Notes: Added Clan Support.
  9. */
  10.  
  11. using System.Collections.Generic;
  12. using UnityEngine;
  13. using Oxide.Core;
  14. using System;
  15. using Newtonsoft.Json.Linq;
  16. using Oxide.Core.Plugins;
  17. using System.IO;
  18.  
  19. namespace Oxide.Plugins
  20. {
  21.     class ProtectedDecayZones : RustPlugin
  22.     {
  23.         [PluginReference]
  24.         Plugin Clans;
  25.  
  26.         #region Config
  27.         private const float _damage = 0.0f; // Mutiply by zero (ie. No damage)
  28.         private const float _radius = 60.0f;
  29.         #endregion
  30.  
  31.         #region DataStructures
  32.         struct BaseZoneInfo
  33.         {
  34.             public Vector3 Pos;
  35.             public float Radius;
  36.             public ulong Owner;
  37.         };
  38.         struct ClanReturnData
  39.         {
  40.             public bool isInClan;
  41.             public List<BasePlayer> clanMates;
  42.         };
  43.         #endregion
  44.  
  45.         #region DataTypes
  46.         private Dictionary<BasePlayer, BaseZoneInfo> VIPBuildData;
  47.         private Dictionary<string, List<BasePlayer>> ClanCacheData;
  48.         private bool clanPluginSupport;
  49.         #endregion  
  50.  
  51.         #region HelperFunctions
  52.         private void WriteLog(string txt)
  53.         {
  54.             PrintWarning(txt);
  55.         }
  56.  
  57.         private ClanReturnData getClanAffiliation(BasePlayer p)
  58.         {
  59.             ClanReturnData clan = new ClanReturnData();
  60.             if (clanPluginSupport)
  61.             {
  62.                 string tag = Clans.Call<string>("GetClanOf", p.userID);
  63.                 if (!string.IsNullOrEmpty(tag))
  64.                 {
  65.                     clan.clanMates = getClanMembersByTag(tag);
  66.                 }
  67.                 else
  68.                 {
  69.                     clan.isInClan = false;
  70.                 }
  71.             }
  72.             else
  73.             {
  74.                 clan.isInClan = false;
  75.             }
  76.             return clan;
  77.         }
  78.  
  79.         private bool hasPlayerSetTheirBase(BasePlayer p, ref BaseZoneInfo pInfo)
  80.         {
  81.             if (VIPBuildData.ContainsKey(p))
  82.             {
  83.                 pInfo = VIPBuildData[p];
  84.                 return true;
  85.             }
  86.             return false;
  87.         }
  88.  
  89.         private bool isPlayerAuthorized(BasePlayer p)
  90.         {
  91.             return true; // DEBUG DEBUG DEBUG DBEBUG
  92.  
  93.             if (p.net.connection.authLevel == 2)
  94.             {
  95.                 return true;
  96.             }
  97.             return false;
  98.         }
  99.  
  100.         private bool isBlockWithinRadius(BaseEntity bInfo, BaseZoneInfo pInfo)
  101.         {
  102.             float D = Vector3.Distance(bInfo.transform.position, pInfo.Pos);
  103.             WriteLog(
  104.                 "Distance From Block: " + D.ToString() +
  105.                 " BLOCK XY: " + bInfo.transform.position.x.ToString() + ", " + bInfo.transform.position.x.ToString() +
  106.                 " Player XY: " + pInfo.Pos.x.ToString() + ", " + pInfo.Pos.y.ToString()
  107.                 );
  108.             return Vector3.Distance(bInfo.transform.position, pInfo.Pos) <= pInfo.Radius;
  109.         }
  110.  
  111.         private bool isBlockOwnedByVIP(BasePlayer p, ref BaseZoneInfo pInfo)
  112.         {
  113.             return (isPlayerAuthorized(p) && hasPlayerSetTheirBase(p, ref pInfo));
  114.         }
  115.  
  116.         private bool PermissionCheck(BasePlayer p, BuildingBlock b)
  117.         {
  118.             BaseZoneInfo pInfo = new BaseZoneInfo();
  119.             if (isBlockOwnedByVIP(p, ref pInfo))
  120.             {
  121.                 if (isBlockWithinRadius(b, pInfo))
  122.                 {
  123.                     return true;
  124.                 }
  125.             }
  126.             return false;
  127.         }
  128.  
  129.         private List<BasePlayer> getClanMembersByTag(string clanTag)
  130.         {
  131.             if (ClanCacheData.ContainsKey(clanTag))
  132.             {
  133.                 return ClanCacheData[clanTag];
  134.             }
  135.             if (prefetchClan(clanTag))
  136.             {
  137.                 return getClanMembersByTag(clanTag);
  138.             }
  139.             else
  140.             {
  141.                 return new List<BasePlayer>();
  142.             }
  143.         }
  144.  
  145.         private bool prefetchClan(string clanTag)
  146.         {
  147.             JObject currClan = Clans.Call<JObject>("GetClan", clanTag);
  148.             if (ClanCacheData.ContainsKey(clanTag))
  149.             {
  150.                 ClanCacheData[clanTag].Clear();
  151.             }
  152.             if (currClan == null)
  153.             {
  154.                 return false;
  155.             }
  156.             ulong ClanPlayrID;
  157.             foreach (string memberid in currClan["members"])
  158.             {
  159.                 ClanPlayrID = Convert.ToUInt64(memberid);
  160.                 if (!ClanCacheData.ContainsKey(clanTag))
  161.                     ClanCacheData.Add(clanTag, new List<BasePlayer>());
  162.                 ClanCacheData[clanTag].Add((BasePlayer.FindByID(ClanPlayrID)));
  163.             }
  164.             return true;
  165.         }
  166.         #endregion
  167.  
  168.         #region Chat
  169.         [ChatCommand("SetBase")]
  170.         private void setBase(BasePlayer p, string myCommand, string[] myArgs)
  171.         {
  172.             if (isPlayerAuthorized(p))
  173.                 addPlayer(p);
  174.         }
  175.  
  176.         [ChatCommand("RemoveBase")]
  177.         private void removeBase(BasePlayer p, string myCommand, string[] myArgs)
  178.         {
  179.             if (isPlayerAuthorized(p))
  180.                 removePlayer(p);
  181.         }
  182.         #endregion
  183.  
  184.         #region MaintenanceFunctions
  185.         private bool addPlayer(BasePlayer p, float rad = _radius)
  186.         {
  187.             WriteLog("Adding Player to system: " + p.ToString());
  188.             BaseZoneInfo PlayerData;
  189.             PlayerData.Pos = p.transform.position;
  190.             PlayerData.Radius = rad;
  191.             PlayerData.Owner = p.userID;
  192.             VIPBuildData[p] = PlayerData;
  193.             //SaveAllData(); // In case server crashes.
  194.             return true;
  195.         }
  196.  
  197.         private bool removePlayer(BasePlayer p)
  198.         {
  199.             if (VIPBuildData.ContainsKey(p))
  200.             {
  201.                 VIPBuildData.Remove(p);
  202.                 //SaveAllData(); // In case server crashes.
  203.                 return true;
  204.             }
  205.             return false;
  206.         }
  207.  
  208.         private void SaveAllData()
  209.         {
  210.             Interface.Oxide.DataFileSystem.WriteObject("ProtectedDecayZones", VIPBuildData);
  211.         }
  212.  
  213.         private void LoadAllData()
  214.         {
  215.             VIPBuildData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<BasePlayer, BaseZoneInfo>>("ProtectedDecayZones");
  216.         }
  217.         #endregion
  218.  
  219.         #region Hooks
  220.         void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo)
  221.         {
  222.             if (!hitInfo.damageTypes.Has(Rust.DamageType.Decay) && entity.OwnerID == 0) return;
  223.             BuildingBlock block = entity as BuildingBlock;
  224.             bool preventDecay = false;
  225.             BasePlayer blockp = BasePlayer.FindByID(entity.OwnerID);
  226.             if (blockp != null)
  227.             {
  228.                 ClanReturnData ClanData = getClanAffiliation(blockp);
  229.  
  230.                 if (ClanData.isInClan)
  231.                 {
  232.                     WriteLog("Player is in clan");
  233.                     foreach (BasePlayer ClanPlayer in ClanData.clanMates)
  234.                     {
  235.                         WriteLog("Checking Clan Player: " + ClanPlayer.ToString());
  236.                         preventDecay = PermissionCheck(ClanPlayer, block);
  237.                         if (preventDecay)
  238.                         {
  239.                             WriteLog("Found Valid Clan Player: " + ClanPlayer.ToString());
  240.                             break;
  241.                         }
  242.                     }
  243.                 }
  244.                 else
  245.                 {
  246.                     preventDecay = PermissionCheck(blockp, block);
  247.                 }
  248.  
  249.                 if (preventDecay)
  250.                 {
  251.                     WriteLog("Preventing Damage decay to block for Player : " + blockp.ToString());
  252.                     hitInfo.damageTypes.Scale(Rust.DamageType.Decay, _damage);
  253.                 }
  254.             }
  255.         }
  256.  
  257.         void Loaded()
  258.         {
  259.             WriteLog("PDZ LOADED (PROBABLY CRASHED!)");
  260.             VIPBuildData = new Dictionary<BasePlayer, BaseZoneInfo>();
  261.             ClanCacheData = new Dictionary<string, List<BasePlayer>>();
  262.  
  263.             LoadAllData();
  264.  
  265.             clanPluginSupport = plugins.Exists("Clans");
  266.         }
  267.  
  268.         void Unload()
  269.         {
  270.             SaveAllData();
  271.         }
  272.  
  273.         void OnClanCreate(string tag)
  274.         {
  275.             prefetchClan(tag);
  276.         }
  277.  
  278.         void OnClanUpdate(string tag)
  279.         {
  280.             prefetchClan(tag);
  281.         }
  282.  
  283.         void OnClanDestroy(string tag)
  284.         {
  285.             if (ClanCacheData.ContainsKey(tag))
  286.             {
  287.                 ClanCacheData.Remove(tag);
  288.             }
  289.         }
  290.         #endregion
  291.     }
  292. }
RAW Paste Data