protected override void OnActivateTool()
    {
        base.OnActivateTool();
        Vector3    cursorPos       = PlayerController.GetCursorPos(KInputManager.GetMousePos());
        GameObject buildingPreview = def.BuildingPreview;
        Vector3    position        = cursorPos;

        Grid.SceneLayer sceneLayer = Grid.SceneLayer.Ore;
        int             gameLayer  = LayerMask.NameToLayer("Place");

        visualizer = GameUtil.KInstantiate(buildingPreview, position, sceneLayer, null, gameLayer);
        KBatchedAnimController component = visualizer.GetComponent <KBatchedAnimController>();

        if ((Object)component != (Object)null)
        {
            component.visibilityType = KAnimControllerBase.VisibilityType.Always;
            component.isMovable      = true;
            component.SetDirty();
        }
        visualizer.SetActive(true);
        Play(visualizer, "None_Place");
        BuildToolHoverTextCard component2 = GetComponent <BuildToolHoverTextCard>();

        component2.currentDef = def;
        ResourceRemainingDisplayScreen.instance.ActivateDisplay(visualizer);
        IHaveUtilityNetworkMgr component3 = def.BuildingComplete.GetComponent <IHaveUtilityNetworkMgr>();

        conduitMgr = component3.GetNetworkManager();
    }
コード例 #2
0
    private void UpdateFrame()
    {
        forceUpdate = false;
        bool symbolVisible = false;

        KAnim.Anim currentAnim = controller.CurrentAnim;
        if (currentAnim != null)
        {
            Matrix2x3 symbolLocalTransform = controller.GetSymbolLocalTransform(symbol, out symbolVisible);
            Vector3   position             = controller.transform.GetPosition();
            if (symbolVisible && (previousMatrix != symbolLocalTransform || position != previousPosition || useTargetPoint))
            {
                previousMatrix   = symbolLocalTransform;
                previousPosition = position;
                Matrix2x3 overrideTransformMatrix = controller.GetTransformMatrix() * symbolLocalTransform;
                Vector3   position2 = base.transform.GetPosition();
                float     z         = position2.z;
                base.transform.SetPosition(overrideTransformMatrix.MultiplyPoint(offset));
                if (useTargetPoint)
                {
                    Vector3 position3 = base.transform.GetPosition();
                    position3.z = 0f;
                    Vector3 from = targetPoint - position3;
                    float   num  = Vector3.Angle(from, Vector3.right);
                    if (from.y < 0f)
                    {
                        num = 360f - num;
                    }
                    base.transform.localRotation = Quaternion.identity;
                    base.transform.RotateAround(position3, new Vector3(0f, 0f, 1f), num);
                    float sqrMagnitude = from.sqrMagnitude;
                    KBatchedAnimInstanceData batchInstanceData = myAnim.GetBatchInstanceData();
                    Vector3 position4 = base.transform.GetPosition();
                    float   x         = position4.x;
                    Vector3 position5 = base.transform.GetPosition();
                    batchInstanceData.SetClipRadius(x, position5.y, sqrMagnitude, true);
                }
                else
                {
                    Vector3 v  = (!controller.FlipX) ? Vector3.right : Vector3.left;
                    Vector3 v2 = (!controller.FlipY) ? Vector3.up : Vector3.down;
                    base.transform.up    = overrideTransformMatrix.MultiplyVector(v2);
                    base.transform.right = overrideTransformMatrix.MultiplyVector(v);
                    if ((Object)myAnim != (Object)null)
                    {
                        myAnim.GetBatchInstanceData()?.SetOverrideTransformMatrix(overrideTransformMatrix);
                    }
                }
                Transform transform = base.transform;
                Vector3   position6 = base.transform.GetPosition();
                float     x2        = position6.x;
                Vector3   position7 = base.transform.GetPosition();
                transform.SetPosition(new Vector3(x2, position7.y, z));
                myAnim.SetDirty();
            }
        }
        if ((Object)myAnim != (Object)null && symbolVisible != myAnim.enabled)
        {
            myAnim.enabled = symbolVisible;
        }
    }
コード例 #3
0
ファイル: KAnimPatches.cs プロジェクト: peterhaneve/ONIMods
        /// <summary>
        /// Updates an active batched anim controller.
        /// </summary>
        /// <param name="instance">The controller to update.</param>
        /// <param name="dt">The time since the last update.</param>
        private static void UpdateActive(KBatchedAnimController instance, float dt)
        {
            Transform transform;
            var       batch   = instance.batch;
            var       visType = instance.visibilityType;
            bool      visible = instance.IsVisible();

            // Check if moved, do this even if offscreen as it may move the anim on screen
            if (batch != null && (transform = instance.transform).hasChanged)
            {
                var      lastChunk = instance.lastChunkXY;
                Vector3  pos = transform.position, posWithOffset = pos + instance.Offset;
                float    z = pos.z;
                Vector2I cellXY;
                bool     always = visType == KAnimControllerBase.VisibilityType.Always;
                transform.hasChanged = false;
                // If this is the only anim in the batch, and the Z coordinate changed,
                // override the Z in the batch
                if (batch.group.maxGroupSize == 1 && instance.lastPos.z != z)
                {
                    batch.OverrideZ(z);
                }
                instance.lastPos = posWithOffset;
                // This is basically GetCellXY() with less accesses to __instance.transform
                if (Grid.CellSizeInMeters == 0.0f)
                {
                    // Handle out-of-game
                    cellXY = new Vector2I((int)posWithOffset.x, (int)posWithOffset.y);
                }
                else
                {
                    cellXY = Grid.PosToXY(posWithOffset);
                }
                if (!always && lastChunk != KBatchedAnimUpdater.INVALID_CHUNK_ID &&
                    KAnimBatchManager.CellXYToChunkXY(cellXY) != lastChunk)
                {
                    // Re-register in a different batch
                    instance.DeRegister();
                    instance.Register();
                }
                else if (visible || always)
                {
                    // Only set dirty if it is on-screen now - changing visible sets dirty
                    // If it moved into a different chunk, Register sets dirty
                    instance.SetDirty();
                }
            }
            // If it has a batch, and is active
            if (instance.batchGroupID != KAnimBatchManager.NO_BATCH)
            {
                var   anim = instance.curAnim;
                var   mode = instance.mode;
                bool  force = instance.forceRebuild, stopped = instance.stopped;
                float t = instance.elapsedTime, increment = dt * instance.playSpeed;
                // Suspend updates if: not currently suspended, not force update, and one
                // of (paused, stopped, no anim, one time and finished with no more to play)
                if (!instance.suspendUpdates && !force && (mode == KAnim.PlayMode.Paused ||
                                                           stopped || anim == null || (mode == KAnim.PlayMode.Once && (t > anim.
                                                                                                                       totalTime || anim.totalTime <= 0f) && instance.animQueue.Count == 0)))
                {
                    instance.SuspendUpdates(true);
                }
                if (visible || force)
                {
                    var aem    = instance.aem;
                    var handle = instance.eventManagerHandle;
                    instance.curAnimFrameIdx = instance.GetFrameIdx(t, true);
                    // Trigger anim event manager if time advanced more than 0.01s
                    if (handle.IsValid() && aem != null)
                    {
                        float elapsedTime = aem.GetElapsedTime(handle);
                        if (Math.Abs(t - elapsedTime) > 0.01f)
                        {
                            aem.SetElapsedTime(handle, t);
                        }
                    }
                    instance.UpdateFrame(t);
                    // Time can be mutated by UpdateFrame
                    if (!stopped && mode != KAnim.PlayMode.Paused)
                    {
                        instance.SetElapsedTime(instance.elapsedTime + increment);
                    }
                    instance.forceRebuild = false;
                }
                else if (visType == KAnimControllerBase.VisibilityType.OffscreenUpdate &&
                         !stopped && mode != KAnim.PlayMode.Paused)
                {
                    // If invisible, only advance if offscreen update is enabled
                    instance.SetElapsedTime(t + increment);
                }
            }
        }
コード例 #4
0
        // This method syncs the object to the transform of the neck snap point in the dupe
        void LateUpdate()
        {
            bool symbolVisible = false;

            if (dupeAnim.CurrentAnim != null)
            {
                var batch = dupeAnim.GetBatch();
                var frame = batch.group.data.GetFrame(dupeAnim.GetCurrentFrameIndex());
                if (frame != KAnim.Anim.Frame.InvalidFrame)
                {
                    for (int i = 0; i < frame.numElements; i++)
                    {
                        int num = frame.firstElementIdx + i;
                        if (num < batch.group.data.frameElements.Count)
                        {
                            KAnim.Anim.FrameElement frameElement = batch.group.data.frameElements[num];
                            if (frameElement.symbol == symbol)
                            {
                                if (frameElement.frame == 0)
                                {
                                    if (facing <= 0)
                                    {
                                        myAnim.Play(front_anim);
                                        facing = 1;
                                    }
                                }
                                else
                                {
                                    if (facing >= 0)
                                    {
                                        myAnim.Play(back_anim);
                                        facing = -1;
                                    }
                                }
                            }
                        }
                    }
                }

                symbolVisible = dupeAnim.GetSymbolVisiblity(symbol);
                bool      unusedBool;
                Matrix2x3 symbolLocalTransform = dupeAnim.GetSymbolLocalTransform(symbol, out unusedBool);
                Vector3   position             = dupeAnim.transform.GetPosition();
                if (symbolVisible && (previousMatrix != symbolLocalTransform || position != previousPosition))
                {
                    previousMatrix   = symbolLocalTransform;
                    previousPosition = position;
                    Matrix2x3 overrideTransformMatrix = dupeAnim.GetTransformMatrix() * symbolLocalTransform;
                    float     z = base.transform.GetPosition().z;
                    base.transform.SetPosition(overrideTransformMatrix.MultiplyPoint(offset));

                    Vector3 v  = dupeAnim.FlipX ? Vector3.left : Vector3.right;
                    Vector3 v2 = dupeAnim.FlipY ? Vector3.down : Vector3.up;
                    base.transform.up    = overrideTransformMatrix.MultiplyVector(v2);
                    base.transform.right = overrideTransformMatrix.MultiplyVector(v);
                    if (myAnim != null)
                    {
                        myAnim.GetBatchInstanceData()?.SetOverrideTransformMatrix(overrideTransformMatrix);
                    }

                    base.transform.SetPosition(new Vector3(base.transform.GetPosition().x, base.transform.GetPosition().y, z));

                    myAnim.Offset = dupeAnim.Offset;
                    myAnim.SetDirty();
                }
            }
            if (myAnim != null && symbolVisible != myAnim.enabled)
            {
                myAnim.enabled = symbolVisible;
            }
        }