示例#1
0
            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);
                            }
                        }
                    }
                }
            }
示例#2
0
 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);
                 }
             }
         }
     }
 }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
 internal void Remove()
 {
     m_wearNTear.Remove();
 }