Пример #1
0
        public void Execute(IRocketPlayer caller, params string[] command)
        {
            if (!LIGHT.Instance.Configuration.Instance.KitsEnabled)
            {
                return;
            }
            string[] permission = {};
            string[] Kits;
            Kits = LIGHT.Instance.Database.GetPlayerKitName(LIGHT.Instance.Database.CheckUserGroup(caller.Id));
            bool hasPerm = false;
            bool console = (caller is ConsolePlayer);

            if (!console)
            {
                if (caller.HasPermission("kits") || caller.HasPermission("kits.*") || caller.HasPermission("*"))
                {
                    hasPerm = true;
                }
                if (!hasPerm && !(caller.IsAdmin))
                {
                    UnturnedChat.Say(caller, LIGHT.Instance.Translate("lpx_no_perm"));
                    return;
                }
            }
            if (command.Length == 0)
            {
                string ListKit = "";
                for (int x = 0; x < Kits.Length; x++)
                {
                    if (x < (Kits.Length - 1))
                    {
                        ListKit += Kits[x] + ", ";
                    }
                    else
                    {
                        ListKit += Kits[x] + ".";
                    }
                }
                UnturnedChat.Say(caller, LIGHT.Instance.Translate("kit_list", ListKit));
                return;
            }
            if (command.Length >= 1)
            {
                hasPerm = false;
                switch (command[0].ToLower())
                {
                case "all":
                    if (caller.HasPermission("kits.all") || caller.HasPermission("kits.*") || caller.HasPermission("*"))
                    {
                        hasPerm = true;
                    }
                    if (!hasPerm && !console && !(caller.IsAdmin))
                    {
                        UnturnedChat.Say(caller, LIGHT.Instance.Translate("lpx_no_perm"));
                        return;
                    }
                    else
                    {
                        Kits = LIGHT.Instance.Database.GetAllKitName();
                        string[] cooldown = new string[Kits.Length];
                        string   ALL      = "";
                        for (int x = 0; x < Kits.Length; x++)
                        {
                            cooldown[x] = LIGHT.Instance.Database.GetKitCooldown(Kits[x]).ToString();
                            if (x < (Kits.Length - 1))
                            {
                                ALL += Kits[x] + " Cooldown: " + cooldown[x] + ", ";
                            }
                            else
                            {
                                ALL += Kits[x] + " Cooldown: " + cooldown[x];
                            }
                        }
                        UnturnedChat.Say(caller, LIGHT.Instance.Translate("kit_list_all", ALL));
                    }
                    break;

                case "cooldown":
                    if (caller.HasPermission("kits.cd") || caller.HasPermission("kits.*") || caller.HasPermission("*"))
                    {
                        hasPerm = true;
                    }
                    if (!hasPerm && !console && !(caller.IsAdmin))
                    {
                        UnturnedChat.Say(caller, LIGHT.Instance.Translate("lpx_no_perm"));
                        return;
                    }
                    else
                    {
                        if (command.Length == 1)
                        {
                            UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_chngcd_help"));
                            return;
                        }
                        if (command.Length == 2)
                        {
                            UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_chngcd_help2"));
                            return;
                        }
                        if (command.Length > 2)
                        {
                            string KitName = "";
                            double NewCD   = 60.00;
                            for (int x = 1; x < command.Length - 1; x++)
                            {
                                KitName += command[x] + " ";
                            }
                            KitName = KitName.Trim();
                            if (double.TryParse(command[command.Length - 1], out NewCD))
                            {
                                if (LIGHT.Instance.Database.SetKitsCooldown(KitName, NewCD))
                                {
                                    UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_success_chngcd", KitName, NewCD));
                                }
                                else
                                {
                                    UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_failed_chngcd", KitName));
                                    return;
                                }
                            }
                            else
                            {
                                UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_error_cooldown", KitName));
                                return;
                            }
                        }
                    }
                    break;

                case "add":
                    if (caller.HasPermission("kits.add") || caller.HasPermission("kits.*") || caller.HasPermission("*"))
                    {
                        hasPerm = true;
                    }
                    if (!hasPerm && !console && !(caller.IsAdmin))
                    {
                        UnturnedChat.Say(caller, LIGHT.Instance.Translate("lpx_no_perm"));
                        return;
                    }
                    else
                    {
                        if (command.Length == 1)
                        {
                            UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_add_help"));
                            return;
                        }
                        if (command.Length >= 2)
                        {
                            string KitName = "";
                            string itemID  = "";
                            double NewCD   = 60.00;
                            for (int x = 1; x < command.Length; x++)
                            {
                                if (!command[x].Contains("/"))
                                {
                                    KitName += command[x] + " ";
                                }
                                else
                                {
                                    itemID += command[x] + " ";
                                }
                            }
                            KitName = KitName.Trim();
                            itemID  = itemID.Trim();
                            if (LIGHT.Instance.Database.AddKit(KitName, itemID, NewCD))
                            {
                                UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_add_success", KitName));
                            }
                            else
                            {
                                UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_add_failed", KitName));
                                return;
                            }
                        }
                    }
                    break;

                case "remove":
                    if (caller.HasPermission("kits.remove") || caller.HasPermission("kits.*") || caller.HasPermission("*"))
                    {
                        hasPerm = true;
                    }
                    if (!hasPerm && !console && !(caller.IsAdmin))
                    {
                        UnturnedChat.Say(caller, LIGHT.Instance.Translate("lpx_no_perm"));
                        return;
                    }
                    else
                    {
                        if (command.Length == 1)
                        {
                            UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_remove_help"));
                            return;
                        }
                        if (command.Length >= 2)
                        {
                            string KitName = "";
                            for (int x = 1; x < command.Length; x++)
                            {
                                KitName += command[x] + " ";
                            }
                            KitName = KitName.Trim();
                            if (LIGHT.Instance.Database.CheckKit(KitName))
                            {
                                if (LIGHT.Instance.Database.RemoveKit(KitName))
                                {
                                    UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_remove_success", KitName));
                                }
                                else
                                {
                                    UnturnedChat.Say(caller, LIGHT.Instance.Translate("kits_remove_failed", KitName));
                                    return;
                                }
                            }
                            else
                            {
                                UnturnedChat.Say(caller, LIGHT.Instance.Translate("kit_notexist"));
                                return;
                            }
                        }
                    }
                    break;

                default:
                    break;
                }
            }
        }
Пример #2
0
        public void Execute(IRocketPlayer caller, string[] command)
        {
            if (AdminToolsPlugin.Config.DisableAbusableCommands)
            {
                UnturnedChat.Say(caller, "Fail_Command_Disabled".Translate());
                return;
            }
            UnturnedPlayer Player = (UnturnedPlayer)caller;

            if (command.Length > 0)
            {
                if (Player.Player.equipment.state == null || Player.Player.equipment.state.Length < 12 || Player.Player.equipment.asset == null || Player.Player.equipment.asset.type != EItemType.GUN)
                {
                    UnturnedChat.Say(caller, "SetAttachment_Fail_Gun".Translate());
                    return;
                }

                ItemAsset Item = null;

                if (ushort.TryParse(command[0], out ushort ItemID))
                {
                    Asset SelectAsset = Assets.find(EAssetType.ITEM, ItemID);
                    if (SelectAsset != null && typeof(ItemAsset).IsAssignableFrom(SelectAsset.GetType()) && Types.Contains(((ItemAsset)SelectAsset).type))
                    {
                        Item = (ItemAsset)SelectAsset;
                    }
                }

                if (Item == null)
                {
                    ItemAsset[] Ast = Assets.find(EAssetType.ITEM).Where(x => typeof(ItemAsset).IsAssignableFrom(x.GetType()) &&
                                                                         Types.Contains(((ItemAsset)x).type) &&
                                                                         ((ItemAsset)x).itemName.ToLower().Contains(command[0].ToLower()))
                                      .Cast <ItemAsset>()
                                      .ToArray();
                    if (Ast.Length != 0)
                    {
                        Item = Ast[0];
                    }
                }

                if (Item != null)
                {
                    if (AdminToolsPlugin.Config.BlacklistedAttachments.Contains(Item.id))
                    {
                        UnturnedChat.Say(caller, "SetAttachment_Fail_Blacklist".Translate());
                        return;
                    }

                    byte pos = 255;
                    if (Item.type == EItemType.SIGHT)
                    {
                        pos = 0;
                    }
                    else if (Item.type == EItemType.TACTICAL)
                    {
                        pos = 2;
                    }
                    else if (Item.type == EItemType.GRIP)
                    {
                        pos = 4;
                    }
                    else if (Item.type == EItemType.BARREL)
                    {
                        pos = 6;
                    }
                    else if (Item.type == EItemType.MAGAZINE)
                    {
                        pos = 8;
                    }
                    if (pos == 255)
                    {
                        return;
                    }
                    byte[] ID = BitConverter.GetBytes(Item.id);
                    Array.Copy(ID, 0, Player.Player.equipment.state, pos, 2);
                    Player.Player.equipment.sendUpdateState();
                    UnturnedChat.Say(caller, "SetAttachment_GaveAttachment".Translate(Item.itemName));
                }
                else
                {
                    UnturnedChat.Say(caller, "SetAttachment_Fail_Item".Translate());
                }
            }
            else
            {
                UnturnedChat.Say(caller, Syntax);
            }
        }
Пример #3
0
        public void Execute(IRocketPlayer caller, string[] command)
        {
            var pluginInstance = BaseClusteringPlugin.Instance;

            if (pluginInstance == null)
            {
                throw new NullReferenceException("BaseClusteringPlugin.Instance is null. Cannot execute command.");
            }

            var args = command.ToList();

            var barricades = args.CheckArgsIncludeString("b", out var index);

            if (index > -1)
            {
                args.RemoveAt(index);
            }

            var structs = args.CheckArgsIncludeString("s", out index);

            if (index > -1)
            {
                args.RemoveAt(index);
            }

            var plants = args.CheckArgsIncludeString("v", out index);

            if (index > -1)
            {
                args.RemoveAt(index);
            }

            var target = args.GetIRocketPlayer(out index);

            if (index > -1)
            {
                args.RemoveAt(index);
            }

            var itemAssetInput = pluginInstance.Translate("not_available");
            var itemAssets     = args.GetMultipleItemAssets(out index);
            var assetCount     = itemAssets.Count;

            if (index > -1)
            {
                itemAssetInput = args[index];
                args.RemoveAt(index);
            }

            var radius = args.GetFloat(out index);

            if (index > -1)
            {
                args.RemoveAt(index);
            }

            var builds = BuildableDirectory.GetBuildables(includePlants: plants);

            if (target != null)
            {
                builds = builds.Where(k => k.Owner.ToString().Equals(target.Id));
            }

            if (barricades)
            {
                builds = builds.Where(k => k.Asset is ItemBarricadeAsset);
            }
            else if (structs)
            {
                builds = builds.Where(k => k.Asset is ItemStructureAsset);
            }

            if (assetCount > 0)
            {
                builds = builds.Where(k => itemAssets.Exists(l => k.AssetId == l.id));
            }

            if (!float.IsNegativeInfinity(radius))
            {
                if (!(caller is UnturnedPlayer cPlayer))
                {
                    UnturnedChat.Say(caller, pluginInstance.Translate("cannot_be_executed_from_console"));
                    return;
                }

                builds = builds.Where(k => (k.Position - cPlayer.Position).sqrMagnitude <= Mathf.Pow(radius, 2));
            }

            var itemAssetName = pluginInstance.Translate("not_available");

            if (assetCount == 1)
            {
                itemAssetName = itemAssets.First().itemName;
            }
            else if (assetCount > 1)
            {
                itemAssetName = itemAssetInput;
            }

            UnturnedChat.Say(caller,
                             pluginInstance.Translate("build_count", builds.Count(), itemAssetName,
                                                      !float.IsNegativeInfinity(radius)
                        ? radius.ToString(CultureInfo.CurrentCulture)
                        : pluginInstance.Translate("not_available"),
                                                      target != null ? target.DisplayName : pluginInstance.Translate("not_available"), plants, barricades,
                                                      structs));
        }
Пример #4
0
        public void Execute(IRocketPlayer caller, string[] command)
        {
            float          radius = 0;
            UnturnedPlayer player = null;

            if (!(caller is ConsolePlayer))
            {
                if (command.GetFloatParameter(0) == null)
                {
                    UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_lv_help"));
                    return;
                }
                player = (UnturnedPlayer)caller;
                radius = (float)command.GetFloatParameter(0);
            }
            foreach (InteractableVehicle vehicle in VehicleManager.vehicles)
            {
                int  count    = 0;
                bool getPInfo = false;
                // skip the vehicle in the list if it is destroyed or drowned.
                if (vehicle.isDead || vehicle.isDrowned)
                {
                    continue;
                }
                if (WreckingBall.Instance.Configuration.Instance.EnablePlayerInfo && WreckingBall.isPlayerInfoLibPresent && WreckingBall.isPlayerInfoLibLoaded)
                {
                    getPInfo = true;
                }
                string lockedBy   = getPInfo ? WreckingBall.Instance.PInfoGenerateMessage((ulong)vehicle.lockedOwner) : vehicle.lockedOwner.ToString();
                ulong  signOwner  = 0;
                string signBy     = string.Empty;
                bool   showSignBy = false;
                if (BarricadeManager.tryGetPlant(vehicle.transform, out byte x, out byte y, out ushort plant, out BarricadeRegion barricadeRegion))
                {
                    count = barricadeRegion.drops.Count;
                }
                if (caller is ConsolePlayer || Vector3.Distance(vehicle.transform.position, player.Position) <= radius)
                {
                    showSignBy = DestructionProcessing.HasFlaggedElement(vehicle.transform, out signOwner);
                    if (showSignBy)
                    {
                        signBy = getPInfo ? WreckingBall.Instance.PInfoGenerateMessage(signOwner) : signOwner.ToString();
                    }
                    ProcessMessages(caller, vehicle.transform, vehicle.asset, vehicle.instanceID, count, lockedBy, vehicle.isLocked, signBy, showSignBy);
                }
                // Handle train cars too, if in range.
                if (vehicle.asset.engine == EEngine.TRAIN && vehicle.trainCars != null && vehicle.trainCars.Length > 1)
                {
                    for (int i = 1; i < vehicle.trainCars.Length; i++)
                    {
                        if (caller is ConsolePlayer || Vector3.Distance(vehicle.trainCars[i].root.transform.position, player.Position) <= radius)
                        {
                            if (BarricadeManager.tryGetPlant(vehicle.trainCars[i].root, out x, out y, out plant, out barricadeRegion))
                            {
                                count = barricadeRegion.drops.Count;
                            }
                            showSignBy = DestructionProcessing.HasFlaggedElement(vehicle.trainCars[i].root, out signOwner);
                            if (showSignBy)
                            {
                                signBy = getPInfo ? WreckingBall.Instance.PInfoGenerateMessage(signOwner) : signOwner.ToString();
                            }
                            ProcessMessages(caller, vehicle.trainCars[i].root, null, vehicle.instanceID, count, lockedBy, false, signBy, showSignBy, true, i);
                        }
                    }
                }
            }
        }
Пример #5
0
        public void Execute(IRocketPlayer caller, string[] command)
        {
            UnturnedPlayer player = (UnturnedPlayer)caller;

            if (command.Length == 0 || command.Length > 2)
            {
                UnturnedChat.Say(player, U.Translate("command_generic_invalid_parameter"));
                throw new WrongUsageOfCommandException(caller, this);
            }

            ushort id     = 0;
            byte   amount = 1;

            string itemString = command[0].ToString();

            if (!ushort.TryParse(itemString, out id))
            {
                List <ItemAsset> sortedAssets = new List <ItemAsset>(SDG.Unturned.Assets.find(EAssetType.ITEM).Cast <ItemAsset>());
                ItemAsset        asset        = sortedAssets.Where(i => i.itemName != null).OrderBy(i => i.itemName.Length).Where(i => i.itemName.ToLower().Contains(itemString.ToLower())).FirstOrDefault();
                if (asset != null)
                {
                    id = asset.id;
                }
                if (String.IsNullOrEmpty(itemString.Trim()) || id == 0)
                {
                    UnturnedChat.Say(player, U.Translate("command_generic_invalid_parameter"));
                    throw new WrongUsageOfCommandException(caller, this);
                }
            }

            Asset a = SDG.Unturned.Assets.find(EAssetType.ITEM, id);

            if (command.Length == 2 && !byte.TryParse(command[1].ToString(), out amount) || a == null)
            {
                UnturnedChat.Say(player, U.Translate("command_generic_invalid_parameter"));
                throw new WrongUsageOfCommandException(caller, this);
            }

            string assetName = ((ItemAsset)a).itemName;

            if (U.Settings.Instance.EnableItemBlacklist && !player.HasPermission("itemblacklist.bypass"))
            {
                for (int i = 0; i < U.Settings.Instance.Items.Count; i++)
                {
                    Blacklist Item = U.Settings.Instance.Items[i];
                    if (id == Item.id)
                    {
                        UnturnedChat.Say(player, U.Translate("command_i_blacklisted"));
                        return;
                    }
                }
            }

            if (U.Settings.Instance.EnableItemSpawnLimit && !player.HasPermission("itemspawnlimit.bypass"))
            {
                if (amount > U.Settings.Instance.MaxSpawnAmount)
                {
                    UnturnedChat.Say(player, U.Translate("command_i_too_much", U.Settings.Instance.MaxSpawnAmount));
                    return;
                }
            }

            if (player.GiveItem(id, amount))
            {
                Logger.Log(U.Translate("command_i_giving_console", player.DisplayName, id, amount));
                UnturnedChat.Say(player, U.Translate("command_i_giving_private", amount, assetName, id));
            }
            else
            {
                UnturnedChat.Say(player, U.Translate("command_i_giving_failed_private", amount, assetName, id));
            }
        }
Пример #6
0
        public void Execute(IRocketPlayer caller, string[] command)
        {
            UnturnedPlayer player = (UnturnedPlayer)caller;

            if (command.Length == 0) // /jail
            {
                UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.syntax")}", Color.red);
                return;
            }

            UnturnedPlayer toPlayer = UnturnedPlayer.FromName(command[0]);

            if (command.Length == 1) // /jail [playername]
            {
                if (toPlayer == null)
                {
                    UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.player.not.found", command[0])}", Color.red);
                    return;
                }
                if (toPlayer.CSteamID == player.CSteamID)
                {
                    UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.player.self")}", Color.red);
                    return;
                }
                UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.syntax")}", Color.red);
                return;
            }

            int.TryParse(command[1], out int resultDuration);
            if (command.Length == 2) // /jail [playername] [duration]
            {
                if (toPlayer == null)
                {
                    UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.player.not.found", command[0])}", Color.red);
                    return;
                }

                if (toPlayer.HasPermission(Permissions[0])) // есть ли у другого игрока пермишен иммунитета
                {
                    UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.player.immune", toPlayer.CharacterName)}", Color.red);
                    return;
                }

                if (JailTimePlugin.Instance.Prison.IsPlayerContains(toPlayer.CSteamID)) // находится ли игрок в тюрьме
                {
                    UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.player.arrested", toPlayer.CharacterName, resultDuration)}", Color.red);
                    return;
                }

                if (toPlayer.CSteamID == player.CSteamID) // проверка на само jail
                {
                    UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.player.self")}", Color.red);
                    return;
                }

                // одеть наручники на игрока
                JailTimePlugin.Instance.Prison.HandcuffToPlayer(toPlayer.CSteamID);

                JailTimePlugin.Instance.Prison.ArrestPlayer(toPlayer.CSteamID, resultDuration);
                UnturnedChat.Say(player, $"{JailTimePlugin.Instance.Translate("jail.successful.arrested", toPlayer.CharacterName, resultDuration)}", Color.yellow);
                UnturnedChat.Say(toPlayer, $"{JailTimePlugin.Instance.Translate("jail.player.arrested.message", player.CharacterName, resultDuration)}", Color.red);
            }
        }
Пример #7
0
        internal static void DestructionLoop(WreckType type)
        {
            try
            {
                int         i = 0;
                EPlayerKill pKill;
                uint        xp;
                while (((dIdx < dIdxCount && type == WreckType.Wreck) || (cdIdx < cdIdxCount && type == WreckType.Cleanup)) && i < WreckingBall.Instance.Configuration.Instance.DestructionsPerInterval)
                {
                    Destructible element = type == WreckType.Wreck ? destroyList[dIdx] : cleanupList[cdIdx];

                    if (element.Type == ElementType.Structure)
                    {
                        try
                        {
                            if (WreckingBall.Instance.Configuration.Instance.EnableDestroyedElementDrop)
                            {
                                try
                                {
                                    Item item = new Item(element.ItemID, true);
                                    ItemManager.dropItem(item, element.Transform.position, false, true, true);
                                }
                                catch (Exception ex) { Logger.LogException(ex, "Error in dropping an item for a destroyed structure."); }
                            }
                            StructureManager.damage(element.Transform, element.Transform.position, ushort.MaxValue, 1, false);
                        }
                        catch (Exception ex) { Logger.LogException(ex, "Error in destroying structure."); }
                    }

                    else if (element.Type == ElementType.Barricade || element.Type == ElementType.VehicleBarricade)
                    {
                        try
                        {
                            if ((element.Type == ElementType.VehicleBarricade && WreckingBall.Instance.Configuration.Instance.EnableVehicleElementDrop) || (element.Type == ElementType.Barricade && WreckingBall.Instance.Configuration.Instance.EnableDestroyedElementDrop))
                            {
                                try
                                {
                                    Item item = new Item(element.ItemID, true);
                                    ItemManager.dropItem(item, element.Transform.position, false, true, true);
                                }
                                catch (Exception ex) { Logger.LogException(ex, "Error in dropping an item for a destroyed" + (element.Type == ElementType.VehicleBarricade ? " vehicle" : string.Empty) + " barricade."); }
                            }
                            BarricadeManager.damage(element.Transform, ushort.MaxValue, 1, false);
                        }
                        catch (Exception ex) { Logger.LogException(ex, "Error in destroying barricade."); }
                    }

                    else if (element.Type == ElementType.Vehicle)
                    {
                        try {
                            // Output log entry if a vehicle is destroyed by a cleanup.
                            if (type == WreckType.Cleanup)
                            {
                                bool getPInfo = WreckingBall.isPlayerInfoLibLoaded;
                                Logger.Log(string.Format("Cleanup: Vehicle with InstanceID: {0}, and Type: {1}({2}), at position: {3} destroyed, Element count: {4}, Sign By: {5}, Locked By: {6}.",
                                                         element.Vehicle.instanceID,
                                                         element.Vehicle.asset.vehicleName,
                                                         element.Vehicle.asset.id,
                                                         element.Vehicle.transform.position.ToString(),
                                                         BarricadeManager.tryGetPlant(element.Vehicle.transform, out byte x, out byte y, out ushort plant, out BarricadeRegion barricadeRegion) ? barricadeRegion.drops.Count : 0,
                                                         HasFlaggedElement(element.Vehicle.transform, out ulong vFlagOwner) ? (getPInfo ? WreckingBall.Instance.PInfoGenerateMessage(vFlagOwner) : vFlagOwner.ToString()) : "N/A",
                                                         element.Vehicle.isLocked ? (getPInfo ? WreckingBall.Instance.PInfoGenerateMessage((ulong)element.Vehicle.lockedOwner) : element.Vehicle.lockedOwner.ToString()) : "N/A"));
                            }
                            if (WreckingBall.Instance.Configuration.Instance.EnableVehicleBuyBack && WreckingBall.isDynShopLoaded && WreckingBall.isUconomyLoaded)
                            {
                                WreckingBall.Instance.VehicleBuyBack(element.Vehicle);
                            }
                            else if (WreckingBall.Instance.Configuration.Instance.EnableVehicleBuyBack)
                            {
                                Logger.LogWarning("EnableVehicleBuyBack was enabled, but either/both the plugins, Uconomy and DynShop, aren't present/loaded.");
                            }
                            if (WreckingBall.Instance.Configuration.Instance.EnableVehicleElementDrop)
                            {
                                if (element.Vehicle.asset.engine == EEngine.TRAIN && element.Vehicle.trainCars != null && element.Vehicle.trainCars.Count() > 1)
                                {
                                    foreach (TrainCar car in element.Vehicle.trainCars)
                                    {
                                        WreckingBall.Instance.VehicleElementDrop(element.Vehicle, true, car.root);
                                    }
                                }
                                else
                                {
                                    WreckingBall.Instance.VehicleElementDrop(element.Vehicle);
                                }
                            }
                            if (!element.Vehicle.isDead)
                            {
                                VehicleManager.askVehicleDestroy(element.Vehicle);
                            }
                        }
                        catch (Exception ex) { Logger.LogException(ex, "Error in destroying vehicle."); }
                    }
                    else if (element.Type == ElementType.Zombie)
                    {
                        try
                        {
                            for (int z = 0; z < 1000 && !element.Zombie.isDead; z++)
                            {
                                element.Zombie.askDamage(ushort.MaxValue, element.Zombie.transform.up, out pKill, out xp);
                            }
                        }
                        catch (Exception ex) { Logger.LogException(ex, "Error in killing zombie."); }
                    }
                    else if (element.Type == ElementType.Animal)
                    {
                        try
                        {
                            for (int a = 0; a < 1000 && !element.Animal.isDead; a++)
                            {
                                element.Animal.askDamage(ushort.MaxValue, element.Animal.transform.up, out pKill, out xp);
                            }
                        }
                        catch (Exception ex) { Logger.LogException(ex, "Error in killing animal."); }
                    }
                    if (type == WreckType.Wreck)
                    {
                        dIdx++;
                    }
                    else
                    {
                        cdIdx++;
                    }
                    i++;
                }
                if (destroyList.Count == dIdx && type == WreckType.Wreck)
                {
                    if (originalCaller != null)
                    {
                        UnturnedChat.Say(originalCaller, WreckingBall.Instance.Translate("wreckingball_complete", dIdx));
                    }
                    else
                    {
                        Logger.Log(WreckingBall.Instance.Translate("wreckingball_complete", dIdx));
                    }
                    SaveManager.save();
                    Abort(WreckType.Wreck);
                }
            }
            catch (Exception ex) { Logger.LogException(ex, "General destruction loop error."); }
        }
Пример #8
0
        internal static void Wreck(IRocketPlayer caller, string filter, float radius, Vector3 position, WreckType type, FlagType flagtype, ulong steamID, ushort itemID)
        {
            bool pInfoLibLoaded = false;

            syncError = false;
            if (type == WreckType.Wreck)
            {
                if (DestructionProcessing.processing)
                {
                    UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_processing", originalCaller != null ? originalCaller.CharacterName : "???", (dIdxCount - dIdx), CalcProcessTime()));
                    return;
                }
                Abort(WreckType.Wreck);
            }
            else if (type == WreckType.Scan)
            {
                WreckingBall.ElementData.reportLists[BuildableType.Element].Clear();
                WreckingBall.ElementData.reportLists[BuildableType.VehicleElement].Clear();
                if (WreckingBall.Instance.Configuration.Instance.EnablePlayerInfo && WreckingBall.isPlayerInfoLibPresent && WreckingBall.isPlayerInfoLibLoaded)
                {
                    pInfoLibLoaded = true;
                }
            }
            UnturnedPlayer Player = null;

            if (!(caller is ConsolePlayer) && type != WreckType.Cleanup)
            {
                Player = (UnturnedPlayer)caller;
                if (Player.IsInVehicle)
                {
                    position = Player.CurrentVehicle.transform.position;
                }
                else
                {
                    position = Player.Position;
                }
            }

            List <char> Filter = new List <char>();

            Filter.AddRange(filter.ToCharArray());

            float           distance  = 0;
            float           vdistance = 0;
            StructureRegion structureRegion;
            BarricadeRegion barricadeRegion;

            for (int k = 0; k < StructureManager.regions.GetLength(0); k++)
            {
                for (int l = 0; l < StructureManager.regions.GetLength(1); l++)
                {
                    // check to see if the region is out of range, skip if it is.
                    if (!radius.IsNaN() && position.RegionOutOfRange(k, l, radius) && type != WreckType.Cleanup && type != WreckType.Counts)
                    {
                        continue;
                    }

                    structureRegion = StructureManager.regions[k, l];
                    ProcessElements(caller, itemID, radius, type, flagtype, Filter, pInfoLibLoaded, structureRegion, position, steamID, BuildableType.Element);
                }
            }

            for (int k = 0; k < BarricadeManager.BarricadeRegions.GetLength(0); k++)
            {
                for (int l = 0; l < BarricadeManager.BarricadeRegions.GetLength(1); l++)
                {
                    // check to see if the region is out of range, skip if it is.
                    if (!radius.IsNaN() && position.RegionOutOfRange(k, l, radius) && type != WreckType.Cleanup && type != WreckType.Counts)
                    {
                        continue;
                    }

                    barricadeRegion = BarricadeManager.BarricadeRegions[k, l];
                    ProcessElements(caller, itemID, radius, type, flagtype, Filter, pInfoLibLoaded, barricadeRegion, position, steamID, BuildableType.Element);
                }
            }


            foreach (InteractableVehicle vehicle in VehicleManager.vehicles)
            {
                bool validVehicleElements = BarricadeManager.tryGetPlant(vehicle.transform, out byte x, out byte y, out ushort plant, out barricadeRegion);
                // Process Vehicles.
                if ((Filter.Contains('V') || Filter.Contains('*')) && type != WreckType.Cleanup && type != WreckType.Counts && (flagtype == FlagType.Normal || (flagtype == FlagType.SteamID && vehicle.isLocked && vehicle.lockedOwner == (CSteamID)steamID)))
                {
                    vdistance = Vector3.Distance(vehicle.transform.position, position);
                    if ((!radius.IsNaN() && vdistance <= radius) || (radius.IsNaN() && (vehicle.transform.position.x.IsNaN() || vehicle.transform.position.y.IsNaN() || vehicle.transform.position.z.IsNaN())))
                    {
                        WreckProcess(caller, 999, vdistance, pInfoLibLoaded, BuildableType.Vehicle, type, vehicle, vehicle.transform, !validVehicleElements ? 0 : barricadeRegion.drops.Count, vehicle.isLocked ? (ulong)vehicle.lockedOwner : 0);
                    }
                    if (vehicle.asset.engine == EEngine.TRAIN && vehicle.trainCars != null && vehicle.trainCars.Length > 1)
                    {
                        for (int i = 1; i < vehicle.trainCars.Length; i++)
                        {
                            if (BarricadeManager.tryGetPlant(vehicle.trainCars[i].root, out x, out y, out plant, out BarricadeRegion barricadeRegion2))
                            {
                                float tcdistance = Vector3.Distance(vehicle.trainCars[i].root.position, position);
                                if (tcdistance <= radius)
                                {
                                    WreckProcess(caller, 999, tcdistance, pInfoLibLoaded, BuildableType.Vehicle, type, vehicle, vehicle.transform, barricadeRegion2 == null ? 0 : barricadeRegion2.drops.Count, 0, i);
                                }
                            }
                        }
                    }
                }

                if (type == WreckType.Cleanup && vehicle.asset.engine != EEngine.TRAIN && WreckingBall.Instance.Configuration.Instance.CleanupLockedCars && vehicle.isLocked && vehicle.lockedOwner == (CSteamID)steamID)
                {
                    cleanupList.Add(new Destructible(vehicle.transform, ElementType.Vehicle, vehicle.asset.id, vehicle));
                }
                // Add Locked vehicles to the top players count, if the cleanup locked vehicles feature is active.
                if (type == WreckType.Counts && vehicle.asset.engine != EEngine.TRAIN && WreckingBall.Instance.Configuration.Instance.CleanupLockedCars && vehicle.isLocked)
                {
                    ulong vOwner = (ulong)vehicle.lockedOwner;
                    if (pElementCounts.ContainsKey(vOwner))
                    {
                        pElementCounts[vOwner]++;
                    }
                    else
                    {
                        pElementCounts.Add(vOwner, 1);
                    }
                }
                // Process vehicles elements, remove distance limiting on vehicle placement for element scanning, to handle massively misplaced elements on vehicles.
                if (validVehicleElements)
                {
                    ProcessElements(caller, itemID, radius, type, flagtype, Filter, pInfoLibLoaded, barricadeRegion, position, steamID, BuildableType.VehicleElement);
                }

                if (vehicle.asset.engine == EEngine.TRAIN && vehicle.trainCars != null && vehicle.trainCars.Length > 1)
                {
                    for (int i = 1; i < vehicle.trainCars.Length; i++)
                    {
                        if (BarricadeManager.tryGetPlant(vehicle.trainCars[i].root, out x, out y, out plant, out BarricadeRegion barricadeRegion2))
                        {
                            ProcessElements(caller, itemID, radius, type, flagtype, Filter, pInfoLibLoaded, barricadeRegion2, position, steamID, BuildableType.VehicleElement);
                        }
                    }
                }
            }

            if (Filter.Contains('Z'))
            {
                for (int z = 0; z < ZombieManager.regions.Length; z++)
                {
                    foreach (Zombie zombie in ZombieManager.regions[z].zombies)
                    {
                        distance = Vector3.Distance(zombie.transform.position, position);
                        if (distance < radius)
                        {
                            WreckProcess(caller, 998, distance, pInfoLibLoaded, BuildableType.Element, type, zombie, zombie.transform);
                        }
                    }
                }
            }

            if (Filter.Contains('A'))
            {
                foreach (Animal animal in AnimalManager.animals)
                {
                    distance = Vector3.Distance(animal.transform.position, position);
                    if (distance <= radius)
                    {
                        WreckProcess(caller, 997, distance, pInfoLibLoaded, BuildableType.Element, type, animal, animal.transform);
                    }
                }
            }


            if (type == WreckType.Scan)
            {
                uint totalCount = 0;
                if (WreckingBall.ElementData.reportLists[BuildableType.Element].Count > 0 || WreckingBall.ElementData.reportLists[BuildableType.VehicleElement].Count > 0)
                {
                    foreach (KeyValuePair <BuildableType, Dictionary <char, uint> > reportDictionary in WreckingBall.ElementData.reportLists)
                    {
                        if (reportDictionary.Value.Count == 0)
                        {
                            continue;
                        }
                        foreach (KeyValuePair <char, uint> reportFilter in reportDictionary.Value)
                        {
                            totalCount += reportFilter.Value;
                        }
                    }
                }
                Logger.Log(string.Format("Player: {0}, ran scan at: {1}, with Radius: {7}, with Flag type: {2}, with Flags: {3}, with ItemID: {4}, with SteamID: {5}, number of elements scanned: {6}", caller is ConsolePlayer ? "Console" : Player.CharacterName + " [" + Player.SteamName + "] (" + Player.CSteamID.ToString() + ")", caller is ConsolePlayer ? "N/A" : Player.Position.ToString(), flagtype.ToString(), Filter.Count > 0 ? string.Join("", Filter.Select(i => i.ToString()).ToArray()) : "N/A", itemID, steamID, totalCount, radius.IsNaN() ? "NaN(NaN Check)" : radius.ToString()));
                return;
            }
            if (destroyList.Count >= 1 && type == WreckType.Wreck)
            {
                Logger.Log(string.Format("Player {0}, queued wreck at: {1}, with Radius: {7}, with Flag type: {2}, with Flags: {3}, with itemID: {4}, with StermID: {5}, number of elements queued: {6}", caller is ConsolePlayer ? "Console" : Player.CharacterName + " [" + Player.SteamName + "] (" + Player.CSteamID.ToString() + ")", caller is ConsolePlayer ? "N/A" : Player.Position.ToString(), flagtype.ToString(), Filter.Count > 0 ? string.Join("", Filter.Select(i => i.ToString()).ToArray()) : "N/A", itemID, steamID, destroyList.Count, radius.IsNaN() ? "NaN(NaN Check)" : radius.ToString()));
                dIdxCount = destroyList.Count;
                WreckingBall.Instance.Instruct(caller);
            }
            else if (type == WreckType.Cleanup)
            {
                cdIdxCount = cleanupList.Count;
            }
            else if (type != WreckType.Counts)
            {
                UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_not_found", radius));
            }
        }