Пример #1
0
        public override MechanicalNetwork GetNetwork(IWorldAccessor world, BlockPos pos)
        {
            BEBehaviorMPTransmission be = world.BlockAccessor.GetBlockEntity(pos)?.GetBehavior <BEBehaviorMPTransmission>();

            if (be == null || !be.engaged)
            {
                return(null);
            }
            return(be.Network);
        }
Пример #2
0
        public bool OnInteract(IPlayer byPlayer)
        {
            BEBehaviorMPTransmission be = Api.World.BlockAccessor.GetBlockEntity(transmissionPos)?.GetBehavior <BEBehaviorMPTransmission>();

            if (!Engaged && be != null && be.engaged)
            {
                return(true);
            }
            Engaged = !Engaged;
            Api.World.PlaySoundAt(new AssetLocation("sounds/effect/woodswitch.ogg"), Pos.X + 0.5, Pos.Y + 0.5, Pos.Z + 0.5, byPlayer);
            if (be != null)
            {
                be.CheckEngaged(Api.World.BlockAccessor, true);
            }

            MarkDirty(true);
            return(true);
        }
        protected override void UpdateLightAndTransformMatrix(int index, Vec3f distToCamera, float rotation, IMechanicalPowerRenderable dev)
        {
            BEBehaviorMPTransmission trans = dev as BEBehaviorMPTransmission;

            if (trans == null)
            {
                return;
            }
            float rot1 = trans.RotationNeighbour(1, true);
            float rot2 = trans.RotationNeighbour(0, true);

            float rotX = rot1 * dev.AxisSign[0];
            float rotY = rot1 * dev.AxisSign[1];
            float rotZ = rot1 * dev.AxisSign[2];

            UpdateLightAndTransformMatrix(matrixAndLightFloats1.Values, index, distToCamera, dev.LightRgba, rotX, rotY, rotZ);

            rotX = rot2 * dev.AxisSign[0];
            rotY = rot2 * dev.AxisSign[1];
            rotZ = rot2 * dev.AxisSign[2];
            UpdateLightAndTransformMatrix(matrixAndLightFloats2.Values, index, distToCamera, dev.LightRgba, rotX, rotY, rotZ);
        }
Пример #4
0
        public float RotationNeighbour()
        {
            if (armAngle > DEGREES15)
            {
                BEBehaviorMPTransmission be = Api.World.BlockAccessor.GetBlockEntity(transmissionPos)?.GetBehavior <BEBehaviorMPTransmission>();
                if (be != null)
                {
                    float transmissionAngle = (this.Facing == BlockFacing.EAST || this.Facing == BlockFacing.NORTH ? REVERSEANGLE - be.AngleRad : be.AngleRad) % GameMath.TWOPI + drumAngleOffset;
                    if (armAngle < DEGREES30)
                    {
                        float angleAdjust = catchUpAngle * (float)(2D - armAngle / DEGREES15);
                        drumSpeed = transmissionAngle - angleAdjust - drumAngle;
                        drumAngle = transmissionAngle - angleAdjust;
                    }
                    else
                    {
                        drumSpeed    = transmissionAngle - drumAngle;
                        drumAngle    = transmissionAngle;
                        catchUpAngle = 0f;
                    }
                }
            }
            else if (this.Engaged)
            {
                BEBehaviorMPTransmission be = Api.World.BlockAccessor.GetBlockEntity(transmissionPos)?.GetBehavior <BEBehaviorMPTransmission>();
                if (be != null)
                {
                    float transmissionAngle = (this.Facing == BlockFacing.EAST || this.Facing == BlockFacing.NORTH ? REVERSEANGLE - be.AngleRad : be.AngleRad) % GameMath.TWOPI;
                    float targetSpeed       = transmissionAngleLast == -0.000001f ? 0f : transmissionAngle - transmissionAngleLast;
                    transmissionAngleLast = transmissionAngle;

                    if (drumAngleOffset < 0f)
                    {
                        int eighths = (int)((drumAngle - transmissionAngle) % GameMath.TWOPI / GameMath.TWOPI * 8f);
                        if (eighths < 0)
                        {
                            eighths += 8;
                        }
                        //else eighths+=2;
                        drumAngleOffset = eighths * GameMath.TWOPI / 8f;
                        drumSpeed       = 0;
                    }
                    float accel = targetSpeed - drumSpeed;
                    if (Math.Abs(accel) > 0.00045f)
                    {
                        accel = accel < 0 ? -0.00045f : 0.00045f;
                    }
                    drumSpeed   += accel;
                    drumAngle   += drumSpeed;
                    catchUpAngle = (transmissionAngle + drumAngleOffset - drumAngle) % GameMath.TWOPI;
                    if (catchUpAngle > GameMath.PI)
                    {
                        catchUpAngle = catchUpAngle - GameMath.TWOPI;
                    }
                    if (catchUpAngle < -GameMath.PI)
                    {
                        catchUpAngle = catchUpAngle + GameMath.TWOPI;
                    }
                }
            }
            else
            {
                drumAngle += drumSpeed;
                if (drumAngle > GameMath.TWOPI)
                {
                    drumAngle = drumAngle % GameMath.TWOPI;
                }
                drumSpeed *= 0.99f;
                if (drumSpeed > 0.0001f)
                {
                    drumSpeed -= 0.0001f;
                }
                else if (drumSpeed > 0)
                {
                    drumSpeed = 0;
                }
                else if (drumSpeed < -0.0001f)
                {
                    drumSpeed += 0.0001f;
                }
                else if (drumSpeed < 0)
                {
                    drumSpeed = 0;
                }
                drumAngleOffset       = -0.000001f;
                transmissionAngleLast = -0.000001f;
            }
            return(drumAngle);
        }
Пример #5
0
        public override void OnNeighbourBlockChange(IWorldAccessor world, BlockPos pos, BlockPos neibpos)
        {
            BEBehaviorMPTransmission be = world.BlockAccessor.GetBlockEntity(pos)?.GetBehavior <BEBehaviorMPTransmission>();

            be?.CheckEngaged(world.BlockAccessor, true);
        }