public void VehicleBuyBack(InteractableVehicle vehicle) { try { if (vehicle.isLocked && vehicle.lockedOwner != CSteamID.Nil) { VehicleInfo info = DShop.Instance.Database.GetVehicleInfo((ulong)vehicle.lockedOwner, vehicle.id); ShopObject svehicle = DShop.Instance.Database.GetItem(ItemType.Vehicle, vehicle.id); if (info != null && svehicle.ItemID == vehicle.id && svehicle.RestrictBuySell != RestrictBuySell.BuyOnly) { Uconomy.Instance.Database.CheckSetupAccount(vehicle.lockedOwner); Uconomy.Instance.Database.IncreaseBalance(vehicle.lockedOwner.ToString(), Math.Round(decimal.Multiply(svehicle.BuyCost, svehicle.SellMultiplier), 2)); DShop.Instance.Database.DeleteVehicleInfo(info); bool getPInfo = WreckingBall.isPlayerInfoLibLoaded; Logger.Log(string.Format("Vehicle buyback successfull for: InstanceID: {0}, and Type: {1}({2}), at position: {3} , Sign By: {4}, Locked By: {5}.", vehicle.instanceID, vehicle.asset.vehicleName, vehicle.id, vehicle.transform.ToString(), DestructionProcessing.HasFlaggedElement(vehicle.transform, out ulong vFlagOwner) ? (getPInfo ? Instance.PInfoGenerateMessage(vFlagOwner) : vFlagOwner.ToString()) : "N/A", vehicle.isLocked ? (getPInfo ? Instance.PInfoGenerateMessage((ulong)vehicle.lockedOwner) : vehicle.lockedOwner.ToString()) : "N/A")); } } } catch (Exception ex) { Logger.LogException(ex, "There was an error with trying to process a vehicle buyback."); } }
public void Execute(IRocketPlayer caller, string[] command) { UnturnedPlayer player = (UnturnedPlayer)caller; Ray ray = new Ray(player.Player.look.aim.position, player.Player.look.aim.forward); RaycastInfo raycastInfo = DamageTool.raycast(ray, 10f, RayMasks.VEHICLE); if (raycastInfo.vehicle != null) { bool getPInfo = false; if (WreckingBall.Instance.Configuration.Instance.EnablePlayerInfo && WreckingBall.isPlayerInfoLibPresent && WreckingBall.isPlayerInfoLibLoaded) { getPInfo = true; } if (!raycastInfo.vehicle.isDead) { bool showSignOwner = false; showSignOwner = DestructionProcessing.HasFlaggedElement(raycastInfo.transform, out ulong signOwner); string signmsg = getPInfo ? WreckingBall.Instance.PInfoGenerateMessage(signOwner) : signOwner.ToString(); string lockedmsg = raycastInfo.vehicle.isLocked ? (!getPInfo || raycastInfo.vehicle.lockedOwner == CSteamID.Nil ? raycastInfo.vehicle.lockedOwner.ToString() : WreckingBall.Instance.PInfoGenerateMessage((ulong)raycastInfo.vehicle.lockedOwner)) : "N/A"; string msg = string.Format("Dropping elements off of vehicle: {0}({1}), InstanceID: {2}, Locked Owner: {3}, SignOwner {4}.", raycastInfo.vehicle.asset.name, raycastInfo.vehicle.id, raycastInfo.vehicle.instanceID, lockedmsg, showSignOwner ? signmsg : "N/A"); UnturnedChat.Say(caller, msg); Logger.Log(msg); WreckingBall.Instance.VehicleElementDrop(raycastInfo.vehicle, true, raycastInfo.transform); } } else { UnturnedChat.Say(caller, "Couldn't find a vehicle in the direction you're looking, or too far away, within 10 units."); } }
public void Execute(IRocketPlayer caller, string[] command) { // Get player elements list. DestructionProcessing.Wreck(caller, "", 0, Vector3.zero, WreckType.Counts, FlagType.SteamID, 0, 0); // Grab what we need from the list. Dictionary <ulong, int> shortenedList = DestructionProcessing.pElementCounts.Where(r => r.Value >= WreckingBall.Instance.Configuration.Instance.PlayerElementListCutoff).OrderBy(v => v.Value).ToDictionary(k => k.Key, v => v.Value); DestructionProcessing.pElementCounts.Clear(); bool getPInfo = false; if (WreckingBall.Instance.Configuration.Instance.EnablePlayerInfo && WreckingBall.isPlayerInfoLibPresent && WreckingBall.isPlayerInfoLibLoaded) { getPInfo = true; } foreach (KeyValuePair <ulong, int> value in shortenedList) { string msg = string.Format("Element count: {0}, Player: {1}", value.Value, !getPInfo || value.Key == 0 ? value.Key.ToString() : WreckingBall.Instance.PInfoGenerateMessage(value.Key)); if (caller is ConsolePlayer) { Logger.Log(msg, ConsoleColor.Yellow); } else { UnturnedChat.Say(caller, msg, Color.yellow); } } }
protected override void Unload() { if (DestructionProcessing.processing) { if (DestructionProcessing.originalCaller != null) { UnturnedChat.Say(DestructionProcessing.originalCaller, Translate("wreckingball_reload_abort"), Color.yellow); } Logger.LogWarning(Translate("wreckingball_reload_abort")); DestructionProcessing.Abort(WreckType.Wreck); } if (DestructionProcessing.cleanupProcessingBuildables || DestructionProcessing.cleanupProcessingFiles) { DestructionProcessing.Abort(WreckType.Cleanup); } ElementData = null; Level.onPostLevelLoaded -= _PostLevelLoaded; }
internal void Confirm(IRocketPlayer caller) { if (DestructionProcessing.destroyList.Count <= 0) { UnturnedChat.Say(caller, Instance.Translate("wreckingball_help")); } else { DestructionProcessing.processing = true; if (!(caller is ConsolePlayer)) { DestructionProcessing.originalCaller = (UnturnedPlayer)caller; } UnturnedChat.Say(caller, Translate("wreckingball_initiated", DestructionProcessing.CalcProcessTime())); Logger.Log(string.Format("Player {0} has initiated wreck.", caller is ConsolePlayer ? "Console" : ((UnturnedPlayer)caller).CharacterName + " [" + ((UnturnedPlayer)caller).SteamName + "] (" + ((UnturnedPlayer)caller).CSteamID.ToString() + ")")); DestructionProcessing.dIdxCount = DestructionProcessing.destroyList.Count; DestructionProcessing.dIdx = 0; } }
// Changed timer to Update(), to attempt to fix ghost objects bug by syncing the destructions to the game frame/tic. public void Update() { if (Instance.State == PluginState.Loaded) { if ((DateTime.Now - DestructionProcessing.lastRunTimeWreck).TotalSeconds > (1 / Instance.Configuration.Instance.DestructionRate)) { DestructionProcessing.lastRunTimeWreck = DateTime.Now; if (DestructionProcessing.processing) { try { DestructionProcessing.DestructionLoop(WreckType.Wreck); } catch { DestructionProcessing.Abort(WreckType.Wreck); } } if (DestructionProcessing.cleanupProcessingBuildables) { try { DestructionProcessing.DestructionLoop(WreckType.Cleanup); } catch { DestructionProcessing.Abort(WreckType.Cleanup); } } } if (Instance.Configuration.Instance.EnableCleanup) { DestructionProcessing.HandleCleanup(); } if (Instance.Configuration.Instance.EnableVehicleCap) { DestructionProcessing.HandleVehicleCap(); } } }
internal void Scan(IRocketPlayer caller, string filter, float radius, Vector3 position, FlagType flagType, ulong steamID, ushort itemID) { DestructionProcessing.Wreck(caller, filter, radius, position, WreckType.Scan, flagType, steamID, itemID); if (ElementData.reportLists[BuildableType.Element].Count > 0 || ElementData.reportLists[BuildableType.VehicleElement].Count > 0) { foreach (KeyValuePair <BuildableType, Dictionary <char, uint> > reportDictionary in ElementData.reportLists) { if (reportDictionary.Value.Count == 0) { continue; } string report = ""; uint totalCount = 0; foreach (KeyValuePair <char, uint> reportFilter in reportDictionary.Value) { report += " " + ElementData.categorys[reportFilter.Key].Name + ": " + reportFilter.Value + ","; totalCount += reportFilter.Value; } if (report != "") { report = report.Remove(report.Length - 1); } string type = reportDictionary.Key == BuildableType.VehicleElement ? "Vehicle Element" : "Element"; if (radius.IsNaN()) { UnturnedChat.Say(caller, Translate("wreckingball_scan_nan_check")); } UnturnedChat.Say(caller, Translate("wreckingball_scan", totalCount, type, radius.ToString(), report)); if (Instance.Configuration.Instance.LogScans && !(caller is ConsolePlayer)) { Logger.Log(Translate("wreckingball_scan", totalCount, type, radius.ToString(), report)); } } } else { UnturnedChat.Say(caller, Translate("wreckingball_not_found", radius)); } }
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); } } } } }
internal void Instruct(IRocketPlayer caller) { UnturnedChat.Say(caller, Translate("wreckingball_queued", DestructionProcessing.dIdxCount, DestructionProcessing.CalcProcessTime())); if (DestructionProcessing.syncError) { UnturnedChat.Say(caller, Translate("wreckingball_sync_error")); } UnturnedChat.Say(caller, Translate("wreckingball_prompt")); }
public void Execute(IRocketPlayer caller, string[] cmd) { string command = String.Join(" ", cmd); if (!caller.IsAdmin && !WreckingBall.Instance.Configuration.Instance.Enabled) { return; } if (!caller.IsAdmin && !caller.HasPermission("wreck")) { return; } UnturnedPlayer player = null; Vector3 position = Vector3.zero; if (!(caller is ConsolePlayer)) { player = (UnturnedPlayer)caller; position = player.Position; } if (String.IsNullOrEmpty(command.Trim())) { if (DestructionProcessing.processing) { DestructionProcessing.Wreck(caller, "", 0, position, WreckType.Wreck, FlagType.Normal, 0, 0); } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help")); return; } } else { string[] oper = command.Split(' '); if (oper.Length >= 1) { switch (oper[0]) { case "confirm": if (!(caller.HasPermission("wreck.wreck") || caller.HasPermission("wreck.*")) && !(caller is ConsolePlayer)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_wreck_permission"), Color.red); return; } WreckingBall.Instance.Confirm(caller); break; case "abort": if (!(caller.HasPermission("wreck.wreck") || caller.HasPermission("wreck.*")) && !(caller is ConsolePlayer)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_wreck_permission"), Color.red); return; } if (!(caller is ConsolePlayer)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_aborted")); } Logger.Log(WreckingBall.Instance.Translate("wreckingball_aborted")); DestructionProcessing.Abort(WreckType.Wreck); break; case "scan": if (!(caller.HasPermission("wreck.scan") || caller.HasPermission("wreck.*")) && !(caller is ConsolePlayer)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_scan_permission"), Color.red); return; } if ((oper.Length == 3 && !(caller is ConsolePlayer)) || (oper.Length == 6 && caller is ConsolePlayer)) { if (caller is ConsolePlayer) { if (!cmd.GetVectorFromCmd(3, out position)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_scan_console")); break; } } ushort itemID = 0; if (ushort.TryParse(oper[1], out itemID)) { WreckingBall.Instance.Scan(caller, oper[1], Convert.ToSingle(oper[2]), position, FlagType.ItemID, 0, itemID); } else { if (oper[2].ToLower() == "nan") { WreckingBall.Instance.Scan(caller, oper[1], float.NaN, position, FlagType.Normal, 0, 0); } else { WreckingBall.Instance.Scan(caller, oper[1], Convert.ToSingle(oper[2]), position, FlagType.Normal, 0, 0); } } } else if ((oper.Length == 4 && !(caller is ConsolePlayer)) || (oper.Length == 7 && caller is ConsolePlayer)) { ulong steamID = 0; if (caller is ConsolePlayer) { if (!cmd.GetVectorFromCmd(4, out position)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_scan_console")); break; } } if (oper[1].isCSteamID(out steamID)) { WreckingBall.Instance.Scan(caller, oper[2], Convert.ToSingle(oper[3]), position, FlagType.SteamID, (ulong)steamID, 0); } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_scan")); } } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_scan")); } break; case "teleport": if (!(caller.HasPermission("wreck.teleport") || caller.HasPermission("wreck.*")) && !(caller is ConsolePlayer)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_teleport_permission"), Color.red); return; } ulong ulSteamID = 0; bool firstSteamID = false; if (oper.Length > 1 && oper[1].isCSteamID(out ulSteamID)) { firstSteamID = true; } if (oper.Length > 1) { if (caller is ConsolePlayer) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_teleport_not_allowed")); break; } string ch = string.Empty; if (firstSteamID && oper.Length > 2) { ch = oper[2]; } else if (!firstSteamID) { ch = oper[1]; } switch (ch) { case "b": WreckingBall.Instance.Teleport(player, TeleportType.Barricades, ulSteamID); break; case "s": WreckingBall.Instance.Teleport(player, TeleportType.Structures, ulSteamID); break; case "v": WreckingBall.Instance.Teleport(player, TeleportType.Vehicles, ulSteamID); break; default: UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_teleport2")); break; } } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_teleport2")); break; } break; default: if (!(caller.HasPermission("wreck.wreck") || caller.HasPermission("wreck.*")) && !(caller is ConsolePlayer)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_wreck_permission"), Color.red); return; } if ((oper.Length == 2 && !(caller is ConsolePlayer)) || (oper.Length == 5 && caller is ConsolePlayer)) { if (caller is ConsolePlayer) { if (!cmd.GetVectorFromCmd(2, out position)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_console")); break; } } ushort itemID = 0; if (ushort.TryParse(oper[0], out itemID)) { DestructionProcessing.Wreck(caller, oper[0], Convert.ToSingle(oper[1]), position, WreckType.Wreck, FlagType.ItemID, 0, itemID); } else { if (oper[1].ToLower() == "nan") { DestructionProcessing.Wreck(caller, oper[0], float.NaN, position, WreckType.Wreck, FlagType.Normal, 0, 0); } else { DestructionProcessing.Wreck(caller, oper[0], Convert.ToSingle(oper[1]), position, WreckType.Wreck, FlagType.Normal, 0, 0); } } } else if ((oper.Length == 3 && !(caller is ConsolePlayer)) || (oper.Length == 6 && caller is ConsolePlayer)) { if (caller is ConsolePlayer) { if (!cmd.GetVectorFromCmd(3, out position)) { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help_console")); break; } } ulong steamID = 0; if (oper[0].isCSteamID(out steamID)) { DestructionProcessing.Wreck(caller, oper[1], Convert.ToSingle(oper[2]), position, WreckType.Wreck, FlagType.SteamID, steamID, 0); } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help")); } } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help")); break; } break; } return; } else { UnturnedChat.Say(caller, WreckingBall.Instance.Translate("wreckingball_help")); } } }
internal void Report(IRocketPlayer caller, ushort itemId, float range, bool printConsole, bool getPinfo, object data, BuildableType type = BuildableType.Element, int count = 0, ulong lockedOwner = 0, int vindex = 0) { Category cat; if (!elements.ContainsKey(itemId)) { if (type == BuildableType.VehicleElement) { if (reportLists[BuildableType.VehicleElement].ContainsKey('!')) { reportLists[BuildableType.VehicleElement]['!'] += 1; } else { reportLists[BuildableType.VehicleElement].Add('!', 1); } cat = categorys['!']; } else { if (reportLists[BuildableType.Element].ContainsKey('!')) { reportLists[BuildableType.Element]['!'] += 1; } else { reportLists[BuildableType.Element].Add('!', 1); } cat = categorys['!']; } } else { if (type == BuildableType.VehicleElement) { if (reportLists[BuildableType.VehicleElement].ContainsKey(elements[itemId].CategoryId)) { reportLists[BuildableType.VehicleElement][elements[itemId].CategoryId] += 1; } else { reportLists[BuildableType.VehicleElement].Add(elements[itemId].CategoryId, 1); } cat = categorys[elements[itemId].CategoryId]; } else { if (reportLists[BuildableType.Element].ContainsKey(elements[itemId].CategoryId)) { reportLists[BuildableType.Element][elements[itemId].CategoryId] += 1; } else { reportLists[BuildableType.Element].Add(elements[itemId].CategoryId, 1); } cat = categorys[elements[itemId].CategoryId]; } } if (printConsole || !elements.ContainsKey(itemId)) { string stype = type == BuildableType.VehicleElement ? "Vehicle Element: " : "Element: "; string msg = string.Empty; ulong owner = 0; InteractableVehicle vehicle = null; StructureData sData = null; BarricadeData bData = null; string eName = string.Empty; if (data is BarricadeData) { bData = data as BarricadeData; owner = bData.owner; eName = bData.barricade.asset.itemName; } else if (data is StructureData) { sData = data as StructureData; owner = sData.owner; eName = sData.structure.asset.itemName; } else if (data is InteractableVehicle) { vehicle = data as InteractableVehicle; itemId = vehicle.id; eName = vehicle.asset.vehicleName; } if (type == BuildableType.Vehicle) { DestructionProcessing.HasFlaggedElement(vindex > 0 ? vehicle.trainCars[vindex].root : vehicle.transform, out ulong signOwner); msg = string.Format("{0}{1} (Id: {6}:{2}, Instance ID: {8}) @ {3}m, Barricade Count: {4}, Sign by: {7}, Locked By: {5}", stype, cat.Name, itemId, Math.Round(range, 2), count, lockedOwner > 0 ? getPinfo ? WreckingBall.Instance.PInfoGenerateMessage(lockedOwner) : lockedOwner.ToString() : "N/A", vindex > 0 ? "Train car#" + vindex : eName, signOwner > 0 ? getPinfo ? WreckingBall.Instance.PInfoGenerateMessage(signOwner) : signOwner.ToString() : "N/A", vehicle.instanceID.ToString()); } else { // Generate the message in another method, as the Player info one requires special data types that have to be loaded before executing a method. msg = string.Format("{0}{1} (Id: {5}:{2}) @ {3}m, Owner: {4}", stype, cat.Name, itemId, Math.Round(range, 2), owner > 0 ? getPinfo ? WreckingBall.Instance.PInfoGenerateMessage(owner) : owner.ToString() : "N/A", eName); } if (WreckingBall.Instance.Configuration.Instance.LogScans) { Logger.Log(msg, cat.Color); } else { Console.ForegroundColor = cat.Color; Console.WriteLine(msg); Console.ResetColor(); if (R.Settings.Instance.RCON.Enabled) { RCONServer.Broadcast(msg); } } if (WreckingBall.Instance.Configuration.Instance.PrintToChat && !(caller is ConsolePlayer)) { UnturnedChat.Say(caller, msg, Color.yellow); } } }
internal void Instruct(IRocketPlayer caller) { UnturnedChat.Say(caller, Translate("wreckingball_queued", DestructionProcessing.dIdxCount, DestructionProcessing.CalcProcessTime()), "https://i.imgur.com/yP6buzW.png"); if (DestructionProcessing.syncError) { UnturnedChat.Say(caller, Translate("wreckingball_sync_error"), "https://i.imgur.com/FeIvao9.png"); } UnturnedChat.Say(caller, Translate("wreckingball_prompt"), "https://i.imgur.com/yP6buzW.png"); }