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); }
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); }
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); }
public override void OnNeighbourBlockChange(IWorldAccessor world, BlockPos pos, BlockPos neibpos) { BEBehaviorMPTransmission be = world.BlockAccessor.GetBlockEntity(pos)?.GetBehavior <BEBehaviorMPTransmission>(); be?.CheckEngaged(world.BlockAccessor, true); }