protected override void DrawSelf(SpriteBatch spriteBatch) { base.DrawSelf(spriteBatch); MyPlayer player = Main.LocalPlayer.GetModPlayer <MyPlayer>(); float quotient = GetPlayerResourceQuotient(player); Rectangle hitbox = GetInnerDimensions().ToRectangle(); hitbox.X += _barDraggableRectangle.X; hitbox.Y += _barDraggableRectangle.Y; hitbox.Width = _barDraggableRectangle.Width; hitbox.Height = _barDraggableRectangle.Height; _frameTimer++; if (_frameTimer >= 20) { _frameTimer = 0; } int frameHeight = 0; int frame = _frameTimer / 5; Vector2 textureOffset = Vector2.Zero; switch (_stat) { case ResourceBarMode.Ki: texture = GFX.GetKiBar(player).kiBarFrame; frameHeight = texture.Height / 4; textureOffset = new Vector2(16, 8); _drawPosition = new Vector2(hitbox.X - 6, hitbox.Y - 6); break; case ResourceBarMode.Overload: texture = GFX.overloadBarFrame; frameHeight = texture.Height / 4; textureOffset = new Vector2(18, 6); _drawPosition = new Vector2(hitbox.X - 8, hitbox.Y - 4); break; default: texture = null; break; } Rectangle sourceRectangle = new Rectangle(0, frameHeight * frame, texture.Width, frameHeight); spriteBatch.Draw(texture, _drawPosition, sourceRectangle, Color.White); Texture2D barSegmentTexture = null; switch (_stat) { case ResourceBarMode.Ki: barSegmentTexture = GFX.GetKiBar(player).kiBarSegment; break; case ResourceBarMode.Overload: barSegmentTexture = GFX.overloadBarSegment; break; } // pessimistic doj if (barSegmentTexture != null) { // draw the segments last. int actualSegments = (int)Math.Ceiling(_segments * quotient); for (int i = 0; i < actualSegments; i += 1) { Vector2 segmentOffsetX = new Vector2(i * 12, 0); Vector2 segmentPosition = _drawPosition + textureOffset + segmentOffsetX; if (i == actualSegments - 1) { float segmentValue = 1f / _segments; float segmentRemainder = quotient % segmentValue; float segmentQuotient = segmentRemainder / segmentValue; // if there's no remainder, it's a full segment, render the whole thing. if (segmentQuotient == 0f) { segmentQuotient = 1f; } // we're on a partial segment, render the whole thing. spriteBatch.Draw(barSegmentTexture, segmentPosition, new Rectangle(0, 0, (int)Math.Ceiling(barSegmentTexture.Width * segmentQuotient), barSegmentTexture.Height), Color.White); } else { // we're on a full segment, render the whole thing. spriteBatch.Draw(barSegmentTexture, segmentPosition, new Rectangle(0, 0, barSegmentTexture.Width, barSegmentTexture.Height), Color.White); } } } }