public void Execute(IRocketPlayer caller, string[] command) { for (byte i = 0; i < Regions.WORLD_SIZE; i += 1) { for (byte j = 0; j < Regions.WORLD_SIZE; j += 1) { BarricadeRegion br = BarricadeManager.regions[i, j]; for (int index = 0; index < br.barricades.Count; index++) { BarricadeData b = br.barricades[index]; if (Assets.find(EAssetType.ITEM, b.barricade.id) is ItemBarricadeAsset asset && asset.build != EBuild.FARM) { b.barricade.health = asset.health; //BarricadeManager.instance.channel.send("tellBarricadeHealth", ESteamCall.ALL, // ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { i, j, ushort.MaxValue, index, b.asset.quality }); } } StructureRegion sr = StructureManager.regions[i, j]; for (int index = 0; index < sr.structures.Count; index++) { StructureData s = sr.structures[index]; if (Assets.find(EAssetType.ITEM, s.structure.id) is ItemStructureAsset asset) { s.structure.health = asset.health; //BarricadeManager.instance.channel.send("tellStructureHealth", ESteamCall.ALL, // ESteamPacket.UPDATE_RELIABLE_BUFFER, new object[] { i, j, ushort.MaxValue, index, s.asset.quality }); } } } } UnturnedChat.Say(caller, "repaired all buildings"); }
private void OnTransformStructureRequested(CSteamID instigator, byte x, byte y, uint instanceID, ref Vector3 point, ref byte angle_x, ref byte angle_y, ref byte angle_z, ref bool shouldAllow) { StructureRegion region = StructureManager.regions[x, y]; int index = region.structures.FindIndex(k => k.instanceID == instanceID); StructureData data = region.structures[index]; StructureDrop drop = region.drops[index]; Player nativePlayer = Provider.clients.FirstOrDefault(x => x?.playerID.steamID == instigator)?.player; UnturnedPlayer player = nativePlayer == null ? null : new UnturnedPlayer(nativePlayer); UnturnedStructureTransformingEvent @event = new UnturnedStructureTransformingEvent( new UnturnedStructureBuildable(data, drop), player, instigator, point, Quaternion.Euler(angle_x * 2, angle_y * 2, angle_z * 2)); Emit(@event); shouldAllow = [email protected]; point = @event.Point; Vector3 eulerAngles = @event.Rotation.eulerAngles; angle_x = MeasurementTool.angleToByte(Mathf.RoundToInt(eulerAngles.x / 2f) * 2); angle_y = MeasurementTool.angleToByte(Mathf.RoundToInt(eulerAngles.y / 2f) * 2); angle_z = MeasurementTool.angleToByte(Mathf.RoundToInt(eulerAngles.z / 2f) * 2); }
public void Execute(ICommandContext context) { UnturnedPlayer player = ((UnturnedUser)context.User).Player; Random random = new Random(DateTime.Now.Millisecond); switch (context.Parameters.Get <string> (0).ToLower()) { case "b": case "barricade": BarricadeRegion randomBRegion = BarricadeManager.regions [random.Next(0, BarricadeManager.BARRICADE_REGIONS), random.Next(0, BarricadeManager.BARRICADE_REGIONS)]; Vector3 randomPoint = randomBRegion.barricades [random.Next(0, randomBRegion.barricades.Count)].point.ToSystemVector(); randomPoint.Y += 10; player.Entity.Teleport(randomPoint); break; case "s": case "structure": StructureRegion randomSRegion = StructureManager.regions [random.Next(0, StructureManager.STRUCTURE_REGIONS), random.Next(0, StructureManager.STRUCTURE_REGIONS)]; randomPoint = randomSRegion.structures [random.Next(0, randomSRegion.structures.Count)].point.ToSystemVector(); randomPoint.Y += 10; player.Entity.Teleport(randomPoint); break; case "v": case "vehicle": randomPoint = VehicleManager.vehicles [random.Next(0, VehicleManager.vehicles.Count)].transform.position.ToSystemVector(); randomPoint.Y += 10; player.Entity.Teleport(randomPoint); break; } }
private void StructureSpawned(StructureRegion region, StructureDrop drop) { var data = region.structures.Find(k => k.instanceID == drop.instanceID); var build = new StructureBuildable(data, drop); m_StructureBuildables.Add(build.InstanceId, build); m_DeferredAdd.Enqueue(build); }
private static void DestroyStructure(StructureRegion region, ushort index) { ThreadUtil.assertIsGameThread(); var data = region.structures[index]; var drop = region.drops[index]; OnStructureDestroyed?.Invoke(data, drop); }
public RaycastResult(RaycastHit Info, bool hit) { RaycastHit = hit; if (hit) { Raycast = Info; Vehicle = TryGetEntity <InteractableVehicle>(); Transform target = Raycast.collider?.transform; if (target != null) { if (target.CompareTag("Barricade")) { target = DamageTool.getBarricadeRootTransform(target); BarricadeRootTransform = target; if (BarricadeManager.tryGetInfo(target, out byte x, out byte y, out ushort plant, out ushort index, out BarricadeRegion Region, out BarricadeDrop Drop)) { BarricadeRegion = Region; BarricadeX = x; BarricadeY = y; BarricadePlant = plant; BarricadeIndex = index; BarricadeData B = Region.barricades.FirstOrDefault(D => D.instanceID == Drop.instanceID); if (B != null) { Barricade = B; } } } else if (target.CompareTag("Structure")) { target = DamageTool.getStructureRootTransform(target); StructureRootTransform = target; if (StructureManager.tryGetInfo(target, out byte x, out byte y, out ushort index, out StructureRegion Region)) { StructureX = x; StructureY = y; StructureIndex = index; StructureRegion = Region; StructureData B = Region.structures[index]; if (B != null) { Structure = B; } } } } } }
public static StructureTag For(int instanceID) { for (byte x = 0; x < Regions.WORLD_SIZE; x++) { for (byte y = 0; y < Regions.WORLD_SIZE; y++) { StructureRegion region = StructureManager.regions[x, y]; for (int i = 0; i < region.structures.Count; i++) { if (instanceID == region.drops[i].model.gameObject.GetInstanceID()) { return(new StructureTag(region.drops[i].model, region.structures[i])); } } } } return(null); }
public StructureTag(Structure structure) { for (byte x = 0; x < Regions.WORLD_SIZE; x++) { for (byte y = 0; y < Regions.WORLD_SIZE; y++) { StructureRegion region = StructureManager.regions[x, y]; for (int i = 0; i < region.structures.Count; i++) { if (structure == region.structures[i].structure) { Internal = region.drops[i].model; InternalData = region.structures[i]; return; } } } } }
private static void ProcessElements(IRocketPlayer caller, ushort itemID, float radius, WreckType type, FlagType flagtype, List <char> Filter, bool pInfoLibLoaded, object region, Vector3 position, ulong steamID, BuildableType buildType) { StructureRegion sRegion = null; BarricadeRegion bRegion = null; BarricadeData bData = null; StructureData sData = null; bool isSRegion = region is StructureRegion; int DataCount; int transformCount; if (isSRegion) { sRegion = region as StructureRegion; transformCount = sRegion.drops.Count; DataCount = sRegion.structures.Count; } else { bRegion = region as BarricadeRegion; transformCount = bRegion.drops.Count; DataCount = bRegion.barricades.Count; } for (int i = 0; i < transformCount; i++) { Transform transform = isSRegion ? sRegion.drops[i].model : bRegion.drops[i].model; ulong owner; if (i < DataCount) { if (isSRegion) { sData = sRegion.structures[i]; owner = sData.owner; } else { bData = bRegion.barricades[i]; owner = bData.owner; } } else { Logger.LogWarning(WreckingBall.Instance.Translate(isSRegion ? "wreckingball_structure_array_sync_error" : "wreckingball_barricade_array_sync_error")); syncError = true; break; } float distance = Vector3.Distance(transform.position, position); if (((!radius.IsNaN() && distance <= radius) || (radius.IsNaN() && (transform.position.x.IsNaN() || transform.position.y.IsNaN() || transform.position.z.IsNaN()))) && type != WreckType.Cleanup && type != WreckType.Counts) { ushort item = isSRegion ? sData.structure.id : bData.barricade.id; if (WreckingBall.ElementData.FilterItem(item, Filter) || Filter.Contains('*') || flagtype == FlagType.ItemID) { if (flagtype == FlagType.Normal) { WreckProcess(caller, item, distance, pInfoLibLoaded, buildType, type, isSRegion ? (object)sData : bData, transform); } else if (flagtype == FlagType.SteamID && owner == steamID) { WreckProcess(caller, item, distance, pInfoLibLoaded, buildType, type, isSRegion ? (object)sData : bData, transform); } else if (flagtype == FlagType.ItemID && itemID == item) { WreckProcess(caller, item, distance, pInfoLibLoaded, buildType, type, isSRegion ? (object)sData : bData, transform); } } } else if (type == WreckType.Cleanup && owner == steamID) { cleanupList.Add(new Destructible(transform, isSRegion ? ElementType.Structure : ElementType.Barricade, isSRegion ? sData.structure.id : bData.barricade.id)); } else if (type == WreckType.Counts) { if (pElementCounts.ContainsKey(owner)) { pElementCounts[owner]++; } else { pElementCounts.Add(owner, 1); } } } }
public List <StructureDataInternal> GetStructureTransforms(UnturnedPlayer player, int radius, ulong SpecificSteamid64, bool GroupOnly, bool Rectangle) { float Distance; Vector3 Center; Rect rect; var position = player.Position; var error = 0; var Structures = new List <StructureDataInternal>(); var transforms = 0; StructureData structure; var regionsfound = 0; var regionsused = 0; Vector3 pointVector3; StructureRegion structureRegion = null; Transform transform = null; for (var x = 0; x < StructureManager.regions.GetLength(0); x++) { for (var y = 0; y < StructureManager.regions.GetLength(1); y++) { regionsfound++; Regions.tryGetPoint((byte)x, (byte)y, out pointVector3); if (Vector3.Distance(pointVector3 += new Vector3(64, 0, 64), new Vector3(position.x, 0f, position.z)) > radius) { continue; } regionsused++; structureRegion = StructureManager.regions[x, y]; transforms = structureRegion.drops.Count; for (var i = 0; i < transforms; i++) { transform = structureRegion.drops[i].model; var Plant = transform.parent != null && transform.parent.CompareTag("Vehicle"); if (structureRegion.structures[i] == null) { error++; continue; } structure = structureRegion.structures[i]; if (GroupOnly) { if (structure.group != player.SteamGroupID.m_SteamID) { continue; } } if (SpecificSteamid64 != 0) { if (structure.owner != SpecificSteamid64) { continue; } } if (Rectangle == false && Vector3.Distance(position, transform.position) < radius - 92 && !Plant) { Structures.Add(new StructureDataInternal(structureRegion.structures[i], transform.parent != null && transform.parent.CompareTag("Vehicle") ? true : false)); } /* Rectangle Stuff * else if (Rectangle && Vector3.Distance(transform.position, Center) < 0) * { * * } */ } } } //Logger.Log($"We have found {regionsfound} regions and used {regionsused} of them."); if (error != 0) { SendMessageAndLog(player, "It seems your structure regions are a bit of sync, if you have issues, gotta restart server. This issue may be caused by one of your plugins.", $"Error on executing SaveSchematic command for {player.CharacterName},it seems structure regions are out of sync, gotta restart if this causes issues. Sorry! This could be caused by a server plugin, or just getting unlucky."); } return(Structures); }
private void Events_OnStructureDeployed(StructureRegion region, StructureDrop drop) { var @event = new UnturnedStructureDeployedEvent(new UnturnedStructureBuildable(drop)); Emit(@event); }
internal static void DestroyStructure(StructureRegion region, ushort index) { ThreadUtil.assertIsGameThread(); OnBuildableDestroyed?.Invoke(region.drops[index].instanceID, true); }