163 lines
7.4 KiB
C#
163 lines
7.4 KiB
C#
using Barotrauma.Networking;
|
|
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; }
|
|
|
|
var paddedFrame = new GUIFrame(new RectTransform(new Vector2(0.75f, 0.75f), GuiFrame.RectTransform, Anchor.Center)
|
|
{
|
|
//RelativeOffset = new Vector2(0, 0.05f)
|
|
}, style: null);
|
|
|
|
var upperArea = new GUIFrame(new RectTransform(new Vector2(1, 0.4f), paddedFrame.RectTransform, Anchor.TopCenter), style: null);
|
|
var lowerArea = new GUIFrame(new RectTransform(new Vector2(1, 0.6f), paddedFrame.RectTransform, Anchor.BottomCenter), style: null);
|
|
|
|
|
|
string rechargeStr = TextManager.Get("PowerContainerRechargeRate");
|
|
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.5f), upperArea.RectTransform, Anchor.TopCenter),
|
|
"RechargeRate", textColor: GUI.Style.TextColor, font: GUI.SubHeadingFont, textAlignment: Alignment.Center)
|
|
{
|
|
TextGetter = () =>
|
|
{
|
|
return rechargeStr.Replace("[rate]", ((int)((rechargeSpeed / maxRechargeSpeed) * 100.0f)).ToString());
|
|
}
|
|
};
|
|
|
|
rechargeSpeedSlider = new GUIScrollBar(new RectTransform(new Vector2(0.9f, 0.4f), upperArea.RectTransform, Anchor.BottomCenter),
|
|
barSize: 0.15f, style: "DeviceSlider")
|
|
{
|
|
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;
|
|
}
|
|
};
|
|
rechargeSpeedSlider.Bar.RectTransform.MaxSize = new Point(rechargeSpeedSlider.Bar.Rect.Height);
|
|
|
|
// lower area --------------------------
|
|
|
|
var textArea = new GUIFrame(new RectTransform(new Vector2(1, 0.4f), lowerArea.RectTransform), style: null);
|
|
var chargeLabel = new GUITextBlock(new RectTransform(new Vector2(0.4f, 0.0f), textArea.RectTransform, Anchor.CenterLeft),
|
|
TextManager.Get("charge"), textColor: GUI.Style.TextColor, font: GUI.SubHeadingFont, textAlignment: Alignment.CenterLeft)
|
|
{
|
|
ToolTip = TextManager.Get("PowerTransferTipPower")
|
|
};
|
|
string kWmin = TextManager.Get("kilowattminute");
|
|
var chargeText = new GUITextBlock(new RectTransform(new Vector2(0.6f, 1), textArea.RectTransform, Anchor.CenterRight),
|
|
"", textColor: GUI.Style.TextColor, font: GUI.Font, textAlignment: Alignment.CenterRight)
|
|
{
|
|
TextGetter = () => $"{(int)charge}/{(int)capacity} {kWmin} ({((int)MathUtils.Percentage(charge, capacity)).ToString()} %)"
|
|
};
|
|
if (chargeText.TextSize.X > chargeText.Rect.Width) { chargeText.Font = GUI.SmallFont; }
|
|
|
|
chargeIndicator = new GUIProgressBar(new RectTransform(new Vector2(1.1f, 0.5f), lowerArea.RectTransform, Anchor.BottomCenter)
|
|
{
|
|
RelativeOffset = new Vector2(0, 0.1f)
|
|
}, barSize: 0.0f, style: "DeviceProgressBar")
|
|
{
|
|
ProgressGetter = () =>
|
|
{
|
|
return capacity <= 0.0f ? 1.0f : charge / capacity;
|
|
}
|
|
};
|
|
}
|
|
|
|
public override void OnItemLoaded()
|
|
{
|
|
base.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, float itemDepth = -1)
|
|
{
|
|
if (indicatorSize.X <= 1.0f || indicatorSize.Y <= 1.0f) { return; }
|
|
|
|
Vector2 itemSize = new Vector2(item.Sprite.SourceRect.Width, item.Sprite.SourceRect.Height) * item.Scale;
|
|
Vector2 indicatorPos = -itemSize / 2 + indicatorPosition * item.Scale;
|
|
if (item.FlippedX && item.Prefab.CanSpriteFlipX) { indicatorPos.X = -indicatorPos.X - indicatorSize.X * item.Scale; }
|
|
if (item.FlippedY && item.Prefab.CanSpriteFlipY) { indicatorPos.Y = -indicatorPos.Y - indicatorSize.Y * item.Scale; }
|
|
|
|
if (charge > 0 && capacity > 0)
|
|
{
|
|
float chargeRatio = MathHelper.Clamp(charge / capacity, 0.0f, 1.0f);
|
|
Color indicatorColor = ToolBox.GradientLerp(chargeRatio, Color.Red, Color.Orange, Color.Green);
|
|
if (!isHorizontal)
|
|
{
|
|
GUI.DrawRectangle(spriteBatch,
|
|
new Vector2(item.DrawPosition.X, -item.DrawPosition.Y + ((indicatorSize.Y * item.Scale) * (1.0f - chargeRatio))) + indicatorPos,
|
|
new Vector2(indicatorSize.X * item.Scale, (indicatorSize.Y * item.Scale) * chargeRatio), indicatorColor, true,
|
|
depth: item.SpriteDepth - 0.00001f);
|
|
}
|
|
else
|
|
{
|
|
GUI.DrawRectangle(spriteBatch,
|
|
new Vector2(item.DrawPosition.X, -item.DrawPosition.Y) + indicatorPos,
|
|
new Vector2((indicatorSize.X * item.Scale) * chargeRatio, indicatorSize.Y * item.Scale), indicatorColor, true,
|
|
depth: item.SpriteDepth - 0.00001f);
|
|
}
|
|
}
|
|
GUI.DrawRectangle(spriteBatch,
|
|
new Vector2(item.DrawPosition.X, -item.DrawPosition.Y) + indicatorPos,
|
|
indicatorSize * item.Scale, Color.Black, depth: item.SpriteDepth - 0.000015f);
|
|
}
|
|
|
|
public void ClientWrite(IWriteMessage msg, object[] extraData)
|
|
{
|
|
msg.WriteRangedInteger((int)(rechargeSpeed / MaxRechargeSpeed * 10), 0, 10);
|
|
}
|
|
|
|
public void ClientRead(ServerNetObject type, IReadMessage msg, float sendingTime)
|
|
{
|
|
if (correctionTimer > 0.0f)
|
|
{
|
|
StartDelayedCorrection(type, msg.ExtractBits(4 + 8), sendingTime);
|
|
return;
|
|
}
|
|
|
|
float rechargeRate = msg.ReadRangedInteger(0, 10) / 10.0f;
|
|
RechargeSpeed = rechargeRate * MaxRechargeSpeed;
|
|
#if CLIENT
|
|
if (rechargeSpeedSlider != null)
|
|
{
|
|
rechargeSpeedSlider.BarScroll = rechargeRate;
|
|
}
|
|
#endif
|
|
Charge = msg.ReadRangedSingle(0.0f, 1.0f, 8) * capacity;
|
|
}
|
|
}
|
|
}
|