static void Postfix(Player __instance, bool __result, Piece piece, int ___m_placeRayMask, GameObject ___m_placementGhost) { if (!modEnabled.Value || !__result) { return; } Vector3 position = ___m_placementGhost.transform.position; Collider[] componentsInChildren = piece.GetComponentsInChildren <Collider>(); Collider[] array = Physics.OverlapSphere(position, 10f, ___m_placeRayMask); foreach (Collider collider in componentsInChildren) { foreach (Collider collider2 in array) { if (collider2.GetComponent <Piece>() && position == collider2.gameObject.transform.position && piece.m_name != collider2.gameObject.GetComponent <Piece>().m_name) { WearNTear component2 = collider2.GetComponent <WearNTear>(); if (component2) { Dbgl("removeing wnt piece"); component2.Remove(); } else { ZNetView component = collider2.GetComponent <ZNetView>(); if (component == null) { continue; } ZLog.Log("Removing non WNT object with hammer " + collider2.name); component.ClaimOwnership(); collider2.GetComponent <Piece>().DropResources(); collider2.GetComponent <Piece>().m_placeEffect.Create(collider2.transform.position, collider2.transform.rotation, collider2.gameObject.transform, 1f); __instance.m_removeEffects.Create(collider2.transform.position, Quaternion.identity, null, 1f); ZNetScene.instance.Destroy(collider2.gameObject); } } } } }
private void Update() { if (!AedenthornUtils.IgnoreKeyPresses(true) && AedenthornUtils.CheckKeyDown(hotKey.Value)) { Player player = Player.m_localPlayer; Dbgl($"Ka-boom"); Collider[] array = Physics.OverlapSphere(player.transform.position, destroyRadius.Value, destroyMask); for (int i = 0; i < array.Length; i++) { Piece piece = array[i].GetComponentInParent <Piece>(); if (piece) { if (!piece.IsCreator()) { continue; } if (!piece.m_canBeRemoved) { continue; } if (Location.IsInsideNoBuildLocation(piece.transform.position)) { continue; } if (!PrivateArea.CheckAccess(piece.transform.position, 0f, true)) { continue; } if (!Traverse.Create(player).Method("CheckCanRemovePiece", new object[] { piece }).GetValue <bool>()) { continue; } ZNetView component = piece.GetComponent <ZNetView>(); if (component == null) { continue; } if (!piece.CanBeRemoved()) { continue; } WearNTear component2 = piece.GetComponent <WearNTear>(); if (component2) { component2.Remove(); } else { component.ClaimOwnership(); piece.DropResources(); piece.m_placeEffect.Create(piece.transform.position, piece.transform.rotation, piece.gameObject.transform, 1f); player.m_removeEffects.Create(piece.transform.position, Quaternion.identity, null, 1f); ZNetScene.instance.Destroy(piece.gameObject); } ItemDrop.ItemData rightItem = player.GetRightItem(); if (rightItem != null) { player.FaceLookDirection(); Traverse.Create(player).Field("m_zanim").GetValue <ZSyncAnimation>().SetTrigger(rightItem.m_shared.m_attack.m_attackAnimation); } } } } }
private static int DemolishPieces(float radius) { Player player = Player.m_localPlayer; if (!player) { return(0); } int count = 0; Collider[] array = Physics.OverlapSphere(player.transform.position, radius, destroyMask); for (int i = 0; i < array.Length; i++) { Piece piece = array[i].GetComponentInParent <Piece>(); if (piece) { if (!piece.IsCreator() && (piece.GetCreator() != 0 || !allowDestroyUncreated.Value)) { continue; } if (!piece.m_canBeRemoved) { continue; } if (Location.IsInsideNoBuildLocation(piece.transform.position)) { continue; } if (!PrivateArea.CheckAccess(piece.transform.position, 0f, true, false)) { continue; } if (requireCraftingStation.Value && !Traverse.Create(player).Method("CheckCanRemovePiece", new object[] { piece }).GetValue <bool>()) { continue; } ZNetView component = piece.GetComponent <ZNetView>(); if (component == null) { continue; } if (!piece.CanBeRemoved()) { continue; } count++; WearNTear component2 = piece.GetComponent <WearNTear>(); if (component2) { component2.Remove(); } else { component.ClaimOwnership(); piece.DropResources(); piece.m_placeEffect.Create(piece.transform.position, piece.transform.rotation, piece.gameObject.transform, 1f); player.m_removeEffects.Create(piece.transform.position, Quaternion.identity, null, 1f); ZNetScene.instance.Destroy(piece.gameObject); } } } return(count); }
public bool Capture(Vector3 position, float radius) { var rot = Camera.main.transform.rotation.eulerAngles; Logger.LogDebug("Collecting piece information"); var numPieces = 0; var collected = new List <Piece>(); var snapPoints = new List <Vector3>(); Transform centerPiece = null; foreach (var piece in BlueprintManager.GetPiecesInRadius(position, radius)) { if (piece.name.StartsWith(BlueprintRunePrefab.BlueprintSnapPointName)) { snapPoints.Add(piece.transform.position); WearNTear wearNTear = piece.GetComponent <WearNTear>(); wearNTear.Remove(); continue; } if (piece.name.StartsWith(BlueprintRunePrefab.BlueprintCenterPointName)) { if (centerPiece == null) { centerPiece = piece.transform; } else { Logger.LogWarning("Multiple center points! Ignoring @ " + piece.transform.position); } WearNTear wearNTear = piece.GetComponent <WearNTear>(); wearNTear.Remove(); continue; } piece.GetComponent <WearNTear>()?.Highlight(); collected.Add(piece); numPieces++; } Logger.LogDebug($"Found {numPieces} in a radius of {radius:F2}"); Vector3 center; if (centerPiece == null) { // Relocate Z var minZ = 9999999.9f; var minX = 9999999.9f; var minY = 9999999.9f; foreach (var piece in collected.Where(x => x.m_category != Piece.PieceCategory.Misc && x.IsPlacedByPlayer())) { minX = Math.Min(piece.m_nview.GetZDO().m_position.x, minX); minZ = Math.Min(piece.m_nview.GetZDO().m_position.z, minZ); minY = Math.Min(piece.m_nview.GetZDO().m_position.y, minY); } Logger.LogDebug($"{minX} - {minY} - {minZ}"); center = new Vector3(minX, minY, minZ); } else { center = centerPiece.position; } // select and order instance piece entries var pieces = collected.Where(x => x.IsPlacedByPlayer() && x.m_category != Piece.PieceCategory.Misc) .OrderBy(x => x.transform.position.y) .ThenBy(x => x.transform.position.x) .ThenBy(x => x.transform.position.z); if (m_pieceEntries == null) { m_pieceEntries = new PieceEntry[pieces.Count()]; } else if (m_pieceEntries.Length > 0) { Array.Clear(m_pieceEntries, 0, m_pieceEntries.Length - 1); Array.Resize(ref m_pieceEntries, pieces.Count()); } uint i = 0; foreach (var piece in pieces) { var pos = piece.m_nview.GetZDO().m_position - center; var quat = piece.m_nview.GetZDO().m_rotation; quat.eulerAngles = piece.transform.eulerAngles; var additionalInfo = piece.GetComponent <TextReceiver>() != null?piece.GetComponent <TextReceiver>().GetText() : ""; string pieceName = piece.name.Split('(')[0]; if (pieceName.EndsWith(PlanPiecePrefab.PlannedSuffix)) { pieceName = pieceName.Replace(PlanPiecePrefab.PlannedSuffix, null); } m_pieceEntries[i++] = new PieceEntry(pieceName, piece.m_category.ToString(), pos, quat, additionalInfo); } if (m_snapPoints == null) { m_snapPoints = new Vector3[snapPoints.Count()]; } for (int j = 0; j < snapPoints.Count(); j++) { m_snapPoints[j] = snapPoints[j] - center; } return(true); }
internal void Remove() { m_wearNTear.Remove(); }