using Barotrauma.Networking; using Lidgren.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; namespace Barotrauma.Items.Components { partial class PowerContainer : Powered, IDrawableComponent, IServerSerializable, IClientSerializable { private GUIProgressBar chargeIndicator; private GUIScrollBar rechargeSpeedSlider; public Vector2 DrawSize { //use the extents of the item as the draw size get { return Vector2.Zero; } } partial void InitProjSpecific() { if (GuiFrame == null) return; GUILayoutGroup paddedFrame = new GUILayoutGroup(new RectTransform(new Vector2(0.9f, 0.7f), GuiFrame.RectTransform, Anchor.Center)) { RelativeSpacing = 0.1f, Stretch = true }; string rechargeStr = TextManager.Get("PowerContainerRechargeRate"); new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), paddedFrame.RectTransform), "RechargeRate", textAlignment: Alignment.Center) { TextGetter = () => { return rechargeStr.Replace("[rate]", ((int)((rechargeSpeed / maxRechargeSpeed) * 100.0f)).ToString()); } }; var sliderArea = new GUILayoutGroup(new RectTransform(new Vector2(1.0f, 0.2f), paddedFrame.RectTransform, Anchor.BottomCenter), isHorizontal: true) { Stretch = true, RelativeSpacing = 0.05f }; new GUITextBlock(new RectTransform(new Vector2(0.15f, 1.0f), sliderArea.RectTransform), "0 %", textAlignment: Alignment.Center); rechargeSpeedSlider = new GUIScrollBar(new RectTransform(new Vector2(0.8f, 1.0f), sliderArea.RectTransform), barSize: 0.25f, style: "GUISlider") { Step = 0.1f, OnMoved = (GUIScrollBar scrollBar, float barScroll) => { float newRechargeSpeed = maxRechargeSpeed * barScroll; if (Math.Abs(newRechargeSpeed - rechargeSpeed) < 0.1f) return false; RechargeSpeed = newRechargeSpeed; if (GameMain.Client != null) { item.CreateClientEvent(this); correctionTimer = CorrectionDelay; } return true; } }; new GUITextBlock(new RectTransform(new Vector2(0.15f, 1.0f), sliderArea.RectTransform), "100 %", textAlignment: Alignment.Center); string chargeStr = TextManager.Get("PowerContainerCharge"); new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.15f), paddedFrame.RectTransform), "Charge", textAlignment: Alignment.Center) { TextGetter = () => { return chargeStr.Replace("[charge]", (int)charge + "/" + (int)capacity).Replace("[percentage]", ((int)((charge / capacity) * 100.0f)).ToString()); } }; chargeIndicator = new GUIProgressBar(new RectTransform(new Vector2(1.0f, 0.2f), paddedFrame.RectTransform), barSize: 0.0f) { ProgressGetter = () => { return charge / capacity; } }; } public override void OnItemLoaded() { if (rechargeSpeedSlider != null) { rechargeSpeedSlider.BarScroll = rechargeSpeed / MaxRechargeSpeed; } } public override void UpdateHUD(Character character, float deltaTime, Camera cam) { float chargeRatio = charge / capacity; chargeIndicator.Color = ToolBox.GradientLerp(chargeRatio, Color.Red, Color.Orange, Color.Green); } public void Draw(SpriteBatch spriteBatch, bool editing = false) { if (indicatorSize.X <= 1.0f || indicatorSize.Y <= 1.0f) return; GUI.DrawRectangle(spriteBatch, new Vector2( item.DrawPosition.X - item.Sprite.SourceRect.Width / 2 * item.Scale + indicatorPosition.X * item.Scale, -item.DrawPosition.Y - item.Sprite.SourceRect.Height / 2 * item.Scale + indicatorPosition.Y * item.Scale), indicatorSize * item.Scale, Color.Black, depth: item.SpriteDepth - 0.00001f); if (charge > 0) { Color indicatorColor = ToolBox.GradientLerp(charge / capacity, Color.Red, Color.Orange, Color.Green); if (!isHorizontal) { GUI.DrawRectangle(spriteBatch, new Vector2( item.DrawPosition.X - item.Sprite.SourceRect.Width / 2 * item.Scale + indicatorPosition.X * item.Scale + 1, -item.DrawPosition.Y - item.Sprite.SourceRect.Height / 2 * item.Scale + indicatorPosition.Y * item.Scale + 1 + ((indicatorSize.Y * item.Scale) * (1.0f - charge / capacity))), new Vector2(indicatorSize.X * item.Scale - 2, (indicatorSize.Y * item.Scale - 2) * (charge / capacity)), indicatorColor, true, depth: item.SpriteDepth - 0.00001f); } else { GUI.DrawRectangle(spriteBatch, new Vector2( item.DrawPosition.X - item.Sprite.SourceRect.Width / 2 * item.Scale + indicatorPosition.X * item.Scale + 1 , -item.DrawPosition.Y - item.Sprite.SourceRect.Height / 2 * item.Scale + indicatorPosition.Y * item.Scale + 1), new Vector2((indicatorSize.X * item.Scale - 2) * (charge / capacity), indicatorSize.Y * item.Scale - 2), indicatorColor, true, depth: item.SpriteDepth - 0.00001f); } } } public void ClientWrite(NetBuffer msg, object[] extraData) { msg.WriteRangedInteger(0, 10, (int)(rechargeSpeed / MaxRechargeSpeed * 10)); } public void ClientRead(ServerNetObject type, NetBuffer msg, float sendingTime) { if (correctionTimer > 0.0f) { StartDelayedCorrection(type, msg.ExtractBits(4 + 8), sendingTime); return; } RechargeSpeed = msg.ReadRangedInteger(0, 10) / 10.0f * maxRechargeSpeed; Charge = msg.ReadRangedSingle(0.0f, 1.0f, 8) * capacity; } } }