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

Brad Copp

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);
        }
    }
}

 

Brad Copp

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

About Us

Codefling is the largest marketplace for plugins, maps, tools, and more, making it easy for customers to discover new content and for creators to monetize their work.

Downloads
2.4m
Total downloads
Customers
10.8k
Customers served
Files Sold
155.4k
Marketplace sales
Payments
3.3m
Processed total
×
×
  • 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.