Jump to content

Hello can you please fix this to ignore the Deep Sea Floating city Planters?

3.0.1 4.0.0

SlayersRust
SlayersRust

Posted

Hello can you please fix this to ignore the Deep Sea Floating city Planters? Players pay then they cannot loot the planters. @Kaucsenta

Bad Cop

Posted

//#define Debug
using HarmonyLib;
using Oxide.Core.Plugins;
using System.Collections.Generic;
using UnityEngine;
using System;
using Oxide.Core;

namespace Oxide.Plugins
{
    [Info("Planterbox Defender", "kaucsenta", "3.0.0")]
    [Description("Only owner, owner team or if clans plugin present, clan can harvest grownable entities")]
    public class PlanterboxDefender : RustPlugin
    {
        [PluginReference]
        private Plugin Clans, Friends;

        private static PlanterboxDefender _instance;

        [AutoPatch]
        [HarmonyPatch(typeof(GrowableEntity), "TakeClones", new Type[]
        {
            typeof(BasePlayer)
        })]
        public class Patch_TakeClones
        {
            public static bool Prefix(GrowableEntity __instance, BasePlayer player)
            {
                return _instance.CanLootGrowableEntity(__instance, player) == null;
            }
        }

        [AutoPatch]
        [HarmonyPatch(typeof(GrowableEntity), "PickFruit", new Type[]
        {
            typeof(BasePlayer),
            typeof(bool)
        })]
        public class Patch_PickFruit
        {
            public static bool Prefix(GrowableEntity __instance, BasePlayer player, bool eat)
            {
                return _instance.CanLootGrowableEntity(__instance, player) == null;
            }
        }

        private void OnServerInitialized()
        {
            _instance = this;
            permission.RegisterPermission("planterboxdefender.admin", this);
        }

        private void OnEntityBuilt(Planner plan, GameObject seed)
        {
            var player = plan.GetOwnerPlayer();
            var isSeed = seed.GetComponent<GrowableEntity>();
            if (player == null || isSeed == null)
            {
                return;
            }

            var held = player.GetActiveItem();

            NextTick(() =>
            {
                if (isSeed.GetParentEntity() == null || !(isSeed.GetParentEntity() is PlanterBox))
                {
                    return;
                }
                else
                {
                    if (!(isSeed.GetParentEntity() is PlanterBox))
                    {
                        return;
                    }
                    else
                    {
                        if (held == null)
                        {
                            return;
                        }

                        PlanterBox temp = (PlanterBox)isSeed.GetParentEntity();
                        ulong plantowner = temp.OwnerID;
                        if (plantowner == player.userID)
                        {
#if Debug
                            PrintToChat("You can harvest0");
#endif
                            return;
                        }

                        if (SameTeam(plantowner, player.userID))
                        {
#if Debug
                            PrintToChat("You can harvest1");
#endif
                            return;
                        }

                        if (SameClan(plantowner, player.userID))
                        {
#if Debug
                            PrintToChat("You can harvest2");
#endif
                            return;
                        }
                        if (HasFriend(plantowner, player.userID))
                        {
#if Debug
                            PrintToChat("You can harvest3");
#endif
                            return;
                        }
                        BuildingPrivlidge PrivlidgeToHarvest = temp.GetBuildingPrivilege();
                        if (PrivlidgeToHarvest?.IsAuthed(player) == true)
                        {
#if Debug
                            PrintToChat("You can harvest4");
#endif
                            return;
                        }
                        player.ChatMessage(lang.GetMessage("Noharvest", this, player.UserIDString));
#if Debug
                        PrintToChat(player.userID.ToString());
#endif
                        var refund = ItemManager.CreateByName(held.info.shortname, 1);

                        if (refund != null)
                        {
                            player.inventory.GiveItem(refund);
                        }
                        return;
                    }
                }
            });

        }

        object CanLootGrowableEntity(GrowableEntity plant, BasePlayer player)
        {
            if (player == null)
            {
                Puts("Player error");
                return true;
            }
            if (plant == null)
            {
                Puts("Plant error");
#if Debug
                PrintToChat(player.userID.ToString());
#endif
                return true;
            }
            if (player != null && permission.UserHasPermission(player.UserIDString, "planterboxdefender.admin"))
                return null;

            var planter = plant.GetPlanter();
            if (planter != null)
            {
                ulong plantowner = planter.OwnerID;

                if (!plantowner.IsSteamId() && DeepSeaManager.IsInsideDeepSea(planter.transform.position))
                {
#if Debug
                    PrintToChat("DeepSea non-player-owned planter: allow harvest");
#endif
                    return null;
                }

                if (plantowner == player.userID)
                {
#if Debug
                    PrintToChat("You can harvest0");
#endif
                    return null;
                }

                if (SameTeam(plantowner, player.userID))
                {
#if Debug
                    PrintToChat("You can harvest1");
#endif
                    return null;
                }

                if (SameClan(plantowner, player.userID))
                {
#if Debug
                    PrintToChat("You can harvest2");
#endif
                    return null;
                }
                if (HasFriend(plantowner, player.userID))
                {
#if Debug
                    PrintToChat("You can harvest3");
#endif
                    return null;
                }
                BuildingPrivlidge PrivlidgeToHarvest = planter.GetBuildingPrivilege();
                if (PrivlidgeToHarvest?.IsAuthed(player) == true)
                {
#if Debug
                    PrintToChat("You can harvest4");
#endif
                    return null;
                }
                player.ChatMessage(lang.GetMessage("Noharvest", this, player.UserIDString));
#if Debug
                PrintToChat(player.userID.ToString());
#endif
                return true;
            }
#if Debug
            PrintToChat("missing planter");
#endif

            return null;
        }

        private bool SameTeam(ulong playerID, ulong friendID)
        {
            if (!RelationshipManager.TeamsEnabled()) return false;
            var playerTeam = RelationshipManager.ServerInstance.FindPlayersTeam(playerID);
            if (playerTeam == null) return false;
            var friendTeam = RelationshipManager.ServerInstance.FindPlayersTeam(friendID);
            if (friendTeam == null) return false;
            return playerTeam == friendTeam;
        }

        private bool HasFriend(ulong playerID, ulong friendID)
        {
            if (Friends == null) return false;
            return (bool)Friends.Call("HasFriend", playerID, friendID);
        }

        private bool SameClan(ulong playerID, ulong friendID)
        {
            if (Clans == null) return false;
            //Clans
            var isMember = Clans.Call("IsClanMember", playerID.ToString(), friendID.ToString());
            if (isMember != null) return (bool)isMember;
            //Rust:IO Clans
            var playerClan = Clans.Call("GetClanOf", playerID);
            if (playerClan == null) return false;
            var friendClan = Clans.Call("GetClanOf", friendID);
            if (friendClan == null) return false;
            return (string)playerClan == (string)friendClan;
        }

        protected override void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["Noharvest"] = "You can't harvest this."
            }, this);
        }
    }
}

 

Bad Cop

Posted

@SlayersRust   minimal patch, checks if planter is in deepsea and not owned by a real player.

Kaucsenta

Posted

Changed Status from Pending to Feature Request

Changed Fixed In to Next Version

2.3m

Downloads

Total number of downloads.

10.6k

Customers

Total customers served.

153.5k

Files Sold

Total number of files sold.

3.3m

Payments Processed

Total payments processed.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.