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