Infinite wall fixes, pressure damage to sub, sub/mode voting & randomization working now, better ui scaling
This commit is contained in:
@@ -104,7 +104,8 @@
|
|||||||
<Compile Include="Source\Networking\NetStats.cs" />
|
<Compile Include="Source\Networking\NetStats.cs" />
|
||||||
<Compile Include="Source\Networking\ReliableSender.cs" />
|
<Compile Include="Source\Networking\ReliableSender.cs" />
|
||||||
<Compile Include="Source\Particles\ParticleEmitter.cs" />
|
<Compile Include="Source\Particles\ParticleEmitter.cs" />
|
||||||
<Compile Include="Source\Screens\NetLobbySettings.cs" />
|
<Compile Include="Source\Networking\GameServerSettings.cs" />
|
||||||
|
<Compile Include="Source\Screens\NetLobbyVoting.cs" />
|
||||||
<Compile Include="Source\Screens\ServerListScreen.cs" />
|
<Compile Include="Source\Screens\ServerListScreen.cs" />
|
||||||
<Compile Include="Source\Utils\Rand.cs" />
|
<Compile Include="Source\Utils\Rand.cs" />
|
||||||
<Compile Include="Source\Events\PropertyTask.cs" />
|
<Compile Include="Source\Events\PropertyTask.cs" />
|
||||||
@@ -905,6 +906,21 @@
|
|||||||
<None Include="Content\SmallFont.xnb">
|
<None Include="Content\SmallFont.xnb">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="Content\Sounds\Damage\creak1.ogg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="Content\Sounds\Damage\creak2.ogg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="Content\Sounds\Damage\creak3.ogg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="Content\Sounds\Damage\creak4.ogg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
|
<None Include="Content\Sounds\Damage\creak5.ogg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
<None Include="Content\Sounds\Damage\HitArmor1.ogg">
|
<None Include="Content\Sounds\Damage\HitArmor1.ogg">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
@@ -932,6 +948,9 @@
|
|||||||
<None Include="Content\Sounds\Damage\StructureBlunt7.ogg">
|
<None Include="Content\Sounds\Damage\StructureBlunt7.ogg">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="Content\Sounds\Music\amb_JD_drone_clattering_machine.ogg">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</None>
|
||||||
<None Include="Content\Sounds\Music\Enter the Maze.ogg">
|
<None Include="Content\Sounds\Music\Enter the Maze.ogg">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</None>
|
</None>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.5 MiB After Width: | Height: | Size: 381 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -28,7 +28,11 @@
|
|||||||
|
|
||||||
<damagesound file="Content/Sounds/Damage/implode.ogg" damagerange="0.0,100.0" damagesoundtype="Implode"/>
|
<damagesound file="Content/Sounds/Damage/implode.ogg" damagerange="0.0,100.0" damagesoundtype="Implode"/>
|
||||||
|
|
||||||
<damagesound file="Content/Sounds/Damage/implode.ogg" damagerange="0.0,100.0" damagesoundtype="Implode"/>
|
<damagesound file="Content/Sounds/Damage/creak1.ogg" damagesoundtype="Pressure"/>
|
||||||
|
<damagesound file="Content/Sounds/Damage/creak2.ogg" damagesoundtype="Pressure"/>
|
||||||
|
<damagesound file="Content/Sounds/Damage/creak3.ogg" damagesoundtype="Pressure"/>
|
||||||
|
<damagesound file="Content/Sounds/Damage/creak4.ogg" damagesoundtype="Pressure"/>
|
||||||
|
<damagesound file="Content/Sounds/Damage/creak5.ogg" damagesoundtype="Pressure"/>
|
||||||
|
|
||||||
|
|
||||||
<music file="Content/Sounds/Music/Simplex.ogg" type="default"/>
|
<music file="Content/Sounds/Music/Simplex.ogg" type="default"/>
|
||||||
@@ -36,4 +40,5 @@
|
|||||||
<music file="Content/Sounds/Music/Enter the Maze.ogg" type="repair" priorityrange="30,60"/>
|
<music file="Content/Sounds/Music/Enter the Maze.ogg" type="repair" priorityrange="30,60"/>
|
||||||
<music file="Content/Sounds/Music/Static Motion.ogg" type="repair" priorityrange="50,80"/>
|
<music file="Content/Sounds/Music/Static Motion.ogg" type="repair" priorityrange="50,80"/>
|
||||||
<music file="Content/Sounds/Music/Unseen Horrors.ogg" type="monster" priorityrange="40,100"/>
|
<music file="Content/Sounds/Music/Unseen Horrors.ogg" type="monster" priorityrange="40,100"/>
|
||||||
|
<music file="Content/Sounds/Music/amb_JD_drone_clattering_machine.ogg" type="deep"/>
|
||||||
</sounds>
|
</sounds>
|
||||||
@@ -379,12 +379,15 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (Info.PickedItemIDs.Any())
|
if (Info.PickedItemIDs.Any())
|
||||||
{
|
{
|
||||||
foreach (ushort id in Info.PickedItemIDs)
|
for (ushort i = 0; i < Info.PickedItemIDs.Count; i++ )
|
||||||
{
|
{
|
||||||
Item item = FindEntityByID(id) as Item;
|
if (i == 0) continue;
|
||||||
|
|
||||||
|
Item item = FindEntityByID(Info.PickedItemIDs[i]) as Item;
|
||||||
if (item == null) continue;
|
if (item == null) continue;
|
||||||
|
|
||||||
item.Pick(this);
|
item.Pick(this, true, true, true);
|
||||||
|
inventory.TryPutItem(item, i, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Microsoft.Xna.Framework;
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
@@ -186,25 +187,27 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
GUIImage image = new GUIImage(new Rectangle(0,0,30,30), HeadSprite, Alignment.TopLeft, frame);
|
GUIImage image = new GUIImage(new Rectangle(0,0,30,30), HeadSprite, Alignment.TopLeft, frame);
|
||||||
|
|
||||||
|
SpriteFont font = frame.Rect.Width<280 ? GUI.SmallFont : GUI.Font;
|
||||||
|
|
||||||
int x = 0, y = 0;
|
int x = 0, y = 0;
|
||||||
new GUITextBlock(new Rectangle(x+80, y, 200, 20), Name, GUI.Style, frame);
|
new GUITextBlock(new Rectangle(x+60, y, 200, 20), Name, GUI.Style, frame, font);
|
||||||
y += 20;
|
y += 20;
|
||||||
|
|
||||||
if (Job!=null)
|
if (Job!=null)
|
||||||
{
|
{
|
||||||
new GUITextBlock(new Rectangle(x+80, y, 200, 20), Job.Name, GUI.Style, frame);
|
new GUITextBlock(new Rectangle(x + 60, y, 200, 20), Job.Name, GUI.Style, frame, font);
|
||||||
y += 30;
|
y += 30;
|
||||||
|
|
||||||
var skills = Job.Skills;
|
var skills = Job.Skills;
|
||||||
skills.Sort((s1, s2) => -s1.Level.CompareTo(s2.Level));
|
skills.Sort((s1, s2) => -s1.Level.CompareTo(s2.Level));
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(x, y, 200, 20), "Skills:", GUI.Style, frame);
|
new GUITextBlock(new Rectangle(x, y, 200, 20), "Skills:", GUI.Style, frame, font);
|
||||||
y += 20;
|
y += 20;
|
||||||
foreach (Skill skill in skills)
|
foreach (Skill skill in skills)
|
||||||
{
|
{
|
||||||
Color textColor = Color.White * (0.5f + skill.Level/200.0f);
|
Color textColor = Color.White * (0.5f + skill.Level/200.0f);
|
||||||
new GUITextBlock(new Rectangle(x+20, y, 200, 20), skill.Name, Color.Transparent, textColor, Alignment.Left, GUI.Style, frame);
|
new GUITextBlock(new Rectangle(x, y, 200, 20), skill.Name, Color.Transparent, textColor, Alignment.Left, GUI.Style, frame).Font = font;
|
||||||
new GUITextBlock(new Rectangle(x + 20, y, 200, 20), skill.Level.ToString(), Color.Transparent, textColor, Alignment.Right, GUI.Style, frame);
|
new GUITextBlock(new Rectangle(x, y, 200, 20), skill.Level.ToString(), Color.Transparent, textColor, Alignment.Right, GUI.Style, frame).Font = font;
|
||||||
y += 20;
|
y += 20;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,8 +221,7 @@ namespace Barotrauma
|
|||||||
pickedItems.Clear();
|
pickedItems.Clear();
|
||||||
foreach (Item item in Character.Inventory.items)
|
foreach (Item item in Character.Inventory.items)
|
||||||
{
|
{
|
||||||
if (item == null) continue;
|
pickedItems.Add(item == null ? (ushort)0 : item.ID);
|
||||||
pickedItems.Add(item.ID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,10 +37,35 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public override void Start(Level level)
|
public override void Start(Level level)
|
||||||
{
|
{
|
||||||
Vector2 position = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)];
|
Vector2 position = Vector2.Zero;
|
||||||
|
|
||||||
|
int tries = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
Vector2 tryPos = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)];
|
||||||
|
|
||||||
|
if (Submarine.PickBody(
|
||||||
|
tryPos + level.Position,
|
||||||
|
tryPos + level.Position - Vector2.UnitY*level.Size.Y,
|
||||||
|
null, Physics.CollisionLevel) != null)
|
||||||
|
{
|
||||||
|
position = tryPos;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
tries++;
|
||||||
|
|
||||||
|
if (tries==10)
|
||||||
|
{
|
||||||
|
position = level.EndPosition - Vector2.UnitY*300.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (tries < 10);
|
||||||
|
|
||||||
|
|
||||||
item = new Item(itemPrefab, position + level.Position);
|
item = new Item(itemPrefab, position + level.Position);
|
||||||
item.MoveWithLevel = true;
|
item.MoveWithLevel = true;
|
||||||
|
item.body.FarseerBody.GravityScale = 0.5f;
|
||||||
//item.MoveWithLevel = true;
|
//item.MoveWithLevel = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -370,12 +370,12 @@ namespace Barotrauma
|
|||||||
|
|
||||||
public GUIComponent FindChild(object userData)
|
public GUIComponent FindChild(object userData)
|
||||||
{
|
{
|
||||||
foreach (GUIComponent child in children)
|
return children.FirstOrDefault(c => c.userData == userData);
|
||||||
{
|
}
|
||||||
if (child.userData == userData) return child;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
public List<GUIComponent> FindChildren(object userData)
|
||||||
|
{
|
||||||
|
return children .FindAll(c => c.userData == userData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void ClearChildren()
|
public virtual void ClearChildren()
|
||||||
|
|||||||
@@ -76,7 +76,13 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
get { return caretPos; }
|
get { return caretPos; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GUITextBlock(Rectangle rect, string text, GUIStyle style, GUIComponent parent, SpriteFont font)
|
||||||
|
: this(rect, text, style, Alignment.TopLeft, Alignment.TopLeft, parent, false, font)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public GUITextBlock(Rectangle rect, string text, GUIStyle style, GUIComponent parent = null, bool wrap = false)
|
public GUITextBlock(Rectangle rect, string text, GUIStyle style, GUIComponent parent = null, bool wrap = false)
|
||||||
: this(rect, text, style, Alignment.TopLeft, Alignment.TopLeft, parent, wrap)
|
: this(rect, text, style, Alignment.TopLeft, Alignment.TopLeft, parent, wrap)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
infoBox = CreateInfoFrame("The amount of power generated by the reactor should be kept close to the amount of power consumed by the devices in the submarine. "
|
infoBox = CreateInfoFrame("The amount of power generated by the reactor should be kept close to the amount of power consumed by the devices in the submarine. "
|
||||||
+"If there isn't enough power, devices won't function properly (or at all), and if there's too much power, some devices may be damaged."
|
+"If there isn't enough power, devices won't function properly (or at all), and if there's too much power, some devices may be damaged."
|
||||||
+" Try to raise the temperature of the reactor close to 3000 degrees by adjusting the fission and cooling rates.");
|
+" Try to raise the temperature of the reactor close to 3000 degrees by adjusting the fission and cooling rates.", true);
|
||||||
|
|
||||||
while (Math.Abs(reactor.Temperature-3000.0f) > 100.0f)
|
while (Math.Abs(reactor.Temperature-3000.0f) > 100.0f)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace Barotrauma.Items.Components
|
|||||||
{
|
{
|
||||||
base.Update(deltaTime, cam);
|
base.Update(deltaTime, cam);
|
||||||
|
|
||||||
if (voltage>=minVoltage)
|
if (voltage >= minVoltage)
|
||||||
{
|
{
|
||||||
pingState = (pingState + deltaTime * 0.5f);
|
pingState = (pingState + deltaTime * 0.5f);
|
||||||
if (pingState>1.0f)
|
if (pingState>1.0f)
|
||||||
|
|||||||
@@ -65,6 +65,11 @@ namespace Barotrauma
|
|||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Vector2 Size
|
||||||
|
{
|
||||||
|
get { return new Vector2(borders.Width, borders.Height); }
|
||||||
|
}
|
||||||
|
|
||||||
public Vector2 EndPosition
|
public Vector2 EndPosition
|
||||||
{
|
{
|
||||||
get { return endPosition; }
|
get { return endPosition; }
|
||||||
@@ -277,7 +282,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
var newPathCells = GeneratePath(new List<Vector2> { start, end }, cells, pathBorders, 0.0f, 0.8f, mirror);
|
var newPathCells = GeneratePath(new List<Vector2> { start, end }, cells, pathBorders, 0.0f, 0.8f, mirror);
|
||||||
|
|
||||||
for (int n = 0; n < newPathCells.Count-5; n += 3)
|
for (int n = 0; n < newPathCells.Count; n += 5)
|
||||||
{
|
{
|
||||||
positionsOfInterest.Add(newPathCells[n].Center);
|
positionsOfInterest.Add(newPathCells[n].Center);
|
||||||
}
|
}
|
||||||
@@ -297,9 +302,13 @@ namespace Barotrauma
|
|||||||
// GeneratePath(rand, tunnelStart, new Vector2(tunnelStart.X, borders.Height), cells, pathBorders, minWidth, 0.1f, mirror)
|
// GeneratePath(rand, tunnelStart, new Vector2(tunnelStart.X, borders.Height), cells, pathBorders, minWidth, 0.1f, mirror)
|
||||||
// );
|
// );
|
||||||
//}
|
//}
|
||||||
|
|
||||||
cells = CleanCells(pathCells);
|
|
||||||
|
|
||||||
|
cells = CleanCells(pathCells);
|
||||||
|
|
||||||
|
pathCells.AddRange(CreateBottomHoles(1.0f, new Rectangle(
|
||||||
|
(int)(borders.Width * 0.2f), 0,
|
||||||
|
(int)(borders.Width * 0.6f), (int)(borders.Height * 0.3f))));
|
||||||
|
|
||||||
foreach (VoronoiCell cell in pathCells)
|
foreach (VoronoiCell cell in pathCells)
|
||||||
{
|
{
|
||||||
cells.Remove(cell);
|
cells.Remove(cell);
|
||||||
@@ -344,6 +353,17 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
Body shaftBody = BodyFactory.CreateRectangle(GameMain.World, 100.0f, 10.0f, 5.0f);
|
||||||
|
shaftBody.BodyType = BodyType.Kinematic;
|
||||||
|
shaftBody.CollisionCategories = Physics.CollisionLevel;
|
||||||
|
shaftBody.SetTransform(ConvertUnits.ToSimUnits((i == 0) ? startPosition : endPosition), 0.0f);
|
||||||
|
shaftBody.SleepingAllowed = false;
|
||||||
|
bodies.Add(shaftBody);
|
||||||
|
}
|
||||||
|
|
||||||
foreach (VoronoiCell cell in cells)
|
foreach (VoronoiCell cell in cells)
|
||||||
{
|
{
|
||||||
foreach (GraphEdge edge in cell.edges)
|
foreach (GraphEdge edge in cell.edges)
|
||||||
@@ -381,6 +401,7 @@ namespace Barotrauma
|
|||||||
//lower values will cause the path to "wander" more, higher will make it head straight to the end
|
//lower values will cause the path to "wander" more, higher will make it head straight to the end
|
||||||
wanderAmount = MathHelper.Clamp(wanderAmount, 0.0f, 1.0f);
|
wanderAmount = MathHelper.Clamp(wanderAmount, 0.0f, 1.0f);
|
||||||
|
|
||||||
|
List<GraphEdge> allowedEdges = new List<GraphEdge>();
|
||||||
List<VoronoiCell> pathCells = new List<VoronoiCell>();
|
List<VoronoiCell> pathCells = new List<VoronoiCell>();
|
||||||
|
|
||||||
VoronoiCell[] targetCells = new VoronoiCell[points.Count];
|
VoronoiCell[] targetCells = new VoronoiCell[points.Count];
|
||||||
@@ -398,12 +419,21 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
int edgeIndex = 0;
|
int edgeIndex = 0;
|
||||||
|
|
||||||
|
allowedEdges.Clear();
|
||||||
|
foreach (GraphEdge edge in currentCell.edges)
|
||||||
|
{
|
||||||
|
if (!limits.Contains(edge.AdjacentCell(currentCell).Center)) continue;
|
||||||
|
|
||||||
|
allowedEdges.Add(edge);
|
||||||
|
}
|
||||||
|
|
||||||
//steer towards target
|
//steer towards target
|
||||||
if (Rand.Range(0.0f, 1.0f, false) > wanderAmount)
|
if (Rand.Range(0.0f, 1.0f, false) > wanderAmount || allowedEdges.Count == 0)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < currentCell.edges.Count; i++)
|
for (int i = 0; i < currentCell.edges.Count; i++)
|
||||||
{
|
{
|
||||||
if (!MathUtils.LinesIntersect(currentCell.Center, targetCells[currentTargetIndex].Center, currentCell.edges[i].point1, currentCell.edges[i].point2)) continue;
|
if (!MathUtils.LinesIntersect(currentCell.Center, targetCells[currentTargetIndex].Center,
|
||||||
|
currentCell.edges[i].point1, currentCell.edges[i].point2)) continue;
|
||||||
edgeIndex = i;
|
edgeIndex = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -411,24 +441,18 @@ namespace Barotrauma
|
|||||||
//choose random edge (ignoring ones where the adjacent cell is outside limits)
|
//choose random edge (ignoring ones where the adjacent cell is outside limits)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
List<GraphEdge> allowedEdges = new List<GraphEdge>();
|
|
||||||
|
|
||||||
foreach (GraphEdge edge in currentCell.edges)
|
|
||||||
{
|
|
||||||
if (!limits.Contains(edge.AdjacentCell(currentCell).Center)) continue;
|
|
||||||
|
|
||||||
allowedEdges.Add(edge);
|
//if (allowedEdges.Count==0)
|
||||||
}
|
//{
|
||||||
if (allowedEdges.Count==0)
|
// edgeIndex = Rand.Int(currentCell.edges.Count, false);
|
||||||
{
|
//}
|
||||||
edgeIndex = Rand.Int(currentCell.edges.Count, false);
|
//else
|
||||||
}
|
//{
|
||||||
else
|
|
||||||
{
|
|
||||||
edgeIndex = Rand.Int(allowedEdges.Count, false);
|
edgeIndex = Rand.Int(allowedEdges.Count, false);
|
||||||
if (mirror && edgeIndex > 0) edgeIndex = allowedEdges.Count - edgeIndex;
|
if (mirror && edgeIndex > 0) edgeIndex = allowedEdges.Count - edgeIndex;
|
||||||
edgeIndex = currentCell.edges.IndexOf(allowedEdges[edgeIndex]);
|
edgeIndex = currentCell.edges.IndexOf(allowedEdges[edgeIndex]);
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
currentCell = currentCell.edges[edgeIndex].AdjacentCell(currentCell);
|
currentCell = currentCell.edges[edgeIndex].AdjacentCell(currentCell);
|
||||||
@@ -495,6 +519,26 @@ namespace Barotrauma
|
|||||||
return pathCells;
|
return pathCells;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<VoronoiCell> CreateBottomHoles(float holeProbability, Rectangle limits)
|
||||||
|
{
|
||||||
|
List<VoronoiCell> toBeRemoved = new List<VoronoiCell>();
|
||||||
|
foreach (VoronoiCell cell in cells)
|
||||||
|
{
|
||||||
|
if (Rand.Range(0.0f, 1.0f, false) > holeProbability) continue;
|
||||||
|
|
||||||
|
if (!limits.Contains(cell.Center)) continue;
|
||||||
|
|
||||||
|
toBeRemoved.Add(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
return toBeRemoved;
|
||||||
|
|
||||||
|
//foreach (VoronoiCell cell in toBeRemoved)
|
||||||
|
//{
|
||||||
|
// cells.Remove(cell);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
private List<VoronoiCell> GetTooCloseCells(List<VoronoiCell> emptyCells, float minDistance)
|
private List<VoronoiCell> GetTooCloseCells(List<VoronoiCell> emptyCells, float minDistance)
|
||||||
{
|
{
|
||||||
List<VoronoiCell> tooCloseCells = new List<VoronoiCell>();
|
List<VoronoiCell> tooCloseCells = new List<VoronoiCell>();
|
||||||
@@ -671,17 +715,7 @@ namespace Barotrauma
|
|||||||
bodies.Add(edgeBody);
|
bodies.Add(edgeBody);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++ )
|
return verticeList.ToArray();
|
||||||
{
|
|
||||||
Body shaftBody = BodyFactory.CreateRectangle(GameMain.World, 100.0f, 10.0f, 5.0f);
|
|
||||||
shaftBody.BodyType = BodyType.Kinematic;
|
|
||||||
shaftBody.CollisionCategories = Physics.CollisionLevel;
|
|
||||||
shaftBody.SetTransform(ConvertUnits.ToSimUnits((i==0) ? startPosition : endPosition), 0.0f);
|
|
||||||
shaftBody.SleepingAllowed = false;
|
|
||||||
bodies.Add(shaftBody);
|
|
||||||
}
|
|
||||||
|
|
||||||
return verticeList.ToArray();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetPosition(Vector2 pos)
|
public void SetPosition(Vector2 pos)
|
||||||
@@ -918,7 +952,7 @@ namespace Barotrauma
|
|||||||
for (int i = 0; i < 2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
basicEffect.World = Matrix.CreateTranslation(new Vector3(Position + wrappingWalls[side, i].Offset, 0.0f)) * cam.ShaderTransform
|
basicEffect.World = Matrix.CreateTranslation(new Vector3(Position + wrappingWalls[side, i].Offset, 0.0f)) * cam.ShaderTransform
|
||||||
* Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f;
|
* Matrix.CreateOrthographic(GameMain.GraphicsWidth, GameMain.GraphicsHeight, -1, 1) * 0.5f;
|
||||||
|
|
||||||
basicEffect.CurrentTechnique.Passes[0].Apply();
|
basicEffect.CurrentTechnique.Passes[0].Apply();
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using Microsoft.Xna.Framework;
|
using FarseerPhysics;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
using Microsoft.Xna.Framework.Graphics;
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -12,7 +13,7 @@ namespace Barotrauma
|
|||||||
class WrappingWall
|
class WrappingWall
|
||||||
{
|
{
|
||||||
|
|
||||||
const float wallWidth = 10000.0f;
|
const float wallWidth = 20000.0f;
|
||||||
|
|
||||||
public VertexPositionTexture[] Vertices;
|
public VertexPositionTexture[] Vertices;
|
||||||
|
|
||||||
@@ -60,7 +61,7 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 wallSectionSize = new Vector2(2000.0f, 2000.0f);
|
Vector2 wallSectionSize = new Vector2(2300.0f, 2300.0f);
|
||||||
Vector2 startPos = (dir < 0) ?
|
Vector2 startPos = (dir < 0) ?
|
||||||
edgeCell.Center + Vector2.UnitX * wallWidth * dir :
|
edgeCell.Center + Vector2.UnitX * wallWidth * dir :
|
||||||
edgeCell.Center + wallWidth * Vector2.UnitX * (dir - 1);
|
edgeCell.Center + wallWidth * Vector2.UnitX * (dir - 1);
|
||||||
@@ -77,7 +78,7 @@ namespace Barotrauma
|
|||||||
float normalizedDist = distFromEdge / (wallWidth / 2);
|
float normalizedDist = distFromEdge / (wallWidth / 2);
|
||||||
|
|
||||||
float variance = 1000.0f * normalizedDist;
|
float variance = 1000.0f * normalizedDist;
|
||||||
bottomVertices.Add(center + new Vector2(Rand.Range(-variance, variance, false), Rand.Range(-variance, variance, false)*5.0f));
|
bottomVertices.Add(center + new Vector2(Rand.Range(-variance, variance, false), Rand.Range(-variance, variance, false)*2.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 1; i < bottomVertices.Count; i++)
|
for (int i = 1; i < bottomVertices.Count; i++)
|
||||||
@@ -127,6 +128,22 @@ namespace Barotrauma
|
|||||||
walls[0, 0] = walls[0, 1];
|
walls[0, 0] = walls[0, 1];
|
||||||
walls[0, 1] = temp;
|
walls[0, 1] = temp;
|
||||||
}
|
}
|
||||||
|
else if (pos.X > walls[1, 1].midPos.X && walls[1,0].midPos.X < pos.X)
|
||||||
|
{
|
||||||
|
walls[1, 0].Shift(2);
|
||||||
|
|
||||||
|
var temp = walls[1, 0];
|
||||||
|
walls[1, 0] = walls[1, 1];
|
||||||
|
walls[1, 1] = temp;
|
||||||
|
}
|
||||||
|
else if (pos.X < walls[1, 0].midPos.X && walls[1, 1].midPos.X > pos.X && walls[1, 1].slot > 0)
|
||||||
|
{
|
||||||
|
walls[1, 1].Shift(-2);
|
||||||
|
|
||||||
|
var temp = walls[0, 0];
|
||||||
|
walls[1, 0] = walls[1, 1];
|
||||||
|
walls[1, 1] = temp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Shift(int amount)
|
public void Shift(int amount)
|
||||||
@@ -134,9 +151,11 @@ namespace Barotrauma
|
|||||||
slot += amount;
|
slot += amount;
|
||||||
|
|
||||||
Vector2 moveAmount = Vector2.UnitX * wallWidth * amount;
|
Vector2 moveAmount = Vector2.UnitX * wallWidth * amount;
|
||||||
|
|
||||||
|
Vector2 simMoveAmount = ConvertUnits.ToSimUnits(moveAmount);
|
||||||
foreach (VoronoiCell cell in cells)
|
foreach (VoronoiCell cell in cells)
|
||||||
{
|
{
|
||||||
cell.body.SetTransform(cell.body.Position + moveAmount, 0.0f);
|
cell.body.SetTransform(cell.body.Position + simMoveAmount, 0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
midPos += moveAmount;
|
midPos += moveAmount;
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
class SubmarineBody
|
class SubmarineBody
|
||||||
{
|
{
|
||||||
|
const float DamageDepth = 0.0f;
|
||||||
|
const float PressureDamageMultiplier = 0.001f;
|
||||||
|
|
||||||
//structure damage = impact * damageMultiplier
|
//structure damage = impact * damageMultiplier
|
||||||
const float DamageMultiplier = 50.0f;
|
const float DamageMultiplier = 50.0f;
|
||||||
|
|
||||||
@@ -27,6 +30,8 @@ namespace Barotrauma
|
|||||||
private set;
|
private set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private float depthDamageTimer;
|
||||||
|
|
||||||
private Submarine sub;
|
private Submarine sub;
|
||||||
|
|
||||||
private Body body;
|
private Body body;
|
||||||
@@ -207,6 +212,8 @@ namespace Barotrauma
|
|||||||
|
|
||||||
ApplyForce(totalForce);
|
ApplyForce(totalForce);
|
||||||
|
|
||||||
|
UpdateDepthDamage(deltaTime);
|
||||||
|
|
||||||
//hullBodies[0].body.LinearVelocity = -hullBodies[0].body.Position;
|
//hullBodies[0].body.LinearVelocity = -hullBodies[0].body.Position;
|
||||||
|
|
||||||
//hullBody.SetTransform(Vector2.Zero , 0.0f);
|
//hullBody.SetTransform(Vector2.Zero , 0.0f);
|
||||||
@@ -240,6 +247,48 @@ namespace Barotrauma
|
|||||||
Speed += force / mass;
|
Speed += force / mass;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateDepthDamage(float deltaTime)
|
||||||
|
{
|
||||||
|
if (sub.Position.Y > DamageDepth) return;
|
||||||
|
|
||||||
|
float depth = DamageDepth - sub.Position.Y;
|
||||||
|
depth = Math.Max(depth, -40000.0f);
|
||||||
|
|
||||||
|
// float prevTimer = depthDamageTimer;
|
||||||
|
|
||||||
|
depthDamageTimer -= deltaTime*depth*PressureDamageMultiplier;
|
||||||
|
|
||||||
|
//if (prevTimer>5.0f && depthDamageTimer<=5.0f)
|
||||||
|
//{
|
||||||
|
// SoundPlayer.PlayDamageSound(DamageSoundType.Pressure, 50.0f,);
|
||||||
|
//}
|
||||||
|
|
||||||
|
if (depthDamageTimer > 0.0f) return;
|
||||||
|
|
||||||
|
Vector2 damagePos = Vector2.Zero;
|
||||||
|
if (Rand.Int(2)==0)
|
||||||
|
{
|
||||||
|
damagePos = new Vector2(
|
||||||
|
(Rand.Int(2) == 0) ? Borders.X : Borders.X+Borders.Width,
|
||||||
|
Rand.Range(Borders.Y - Borders.Height, Borders.Y));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
damagePos = new Vector2(
|
||||||
|
Rand.Range(Borders.X, Borders.X + Borders.Width),
|
||||||
|
(Rand.Int(2) == 0) ? Borders.Y : Borders.Y - Borders.Height);
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundPlayer.PlayDamageSound(DamageSoundType.Pressure, 50.0f, damagePos, 5000.0f);
|
||||||
|
|
||||||
|
GameMain.GameScreen.Cam.Shake = depth * PressureDamageMultiplier * 0.1f;
|
||||||
|
|
||||||
|
Explosion.RangedStructureDamage(damagePos, depth * PressureDamageMultiplier * 50.0f, depth * PressureDamageMultiplier);
|
||||||
|
//SoundPlayer.PlayDamageSound(DamageSoundType.StructureBlunt, Rand.Range(0.0f, 100.0f), damagePos, 5000.0f);
|
||||||
|
|
||||||
|
depthDamageTimer = 10.0f;
|
||||||
|
}
|
||||||
|
|
||||||
private void UpdateColliding()
|
private void UpdateColliding()
|
||||||
{
|
{
|
||||||
if (body.Position.LengthSquared()<0.00001f) return;
|
if (body.Position.LengthSquared()<0.00001f) return;
|
||||||
|
|||||||
@@ -226,7 +226,6 @@ namespace Barotrauma
|
|||||||
//try to give the crew member a spawnpoint that hasn't been assigned to anyone and matches their job
|
//try to give the crew member a spawnpoint that hasn't been assigned to anyone and matches their job
|
||||||
for (int n = 0; n < unassignedWayPoints.Count; n++)
|
for (int n = 0; n < unassignedWayPoints.Count; n++)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (crew[i].Job.Prefab != unassignedWayPoints[n].assignedJob) continue;
|
if (crew[i].Job.Prefab != unassignedWayPoints[n].assignedJob) continue;
|
||||||
assignedWayPoints[i] = unassignedWayPoints[n];
|
assignedWayPoints[i] = unassignedWayPoints[n];
|
||||||
unassignedWayPoints.RemoveAt(n);
|
unassignedWayPoints.RemoveAt(n);
|
||||||
|
|||||||
@@ -438,7 +438,12 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
AddChatMessage(inc.ReadString(), ChatMessageType.Server);
|
AddChatMessage(inc.ReadString(), ChatMessageType.Server);
|
||||||
Client disconnectedClient = otherClients.Find(c => c.ID == leavingID);
|
Client disconnectedClient = otherClients.Find(c => c.ID == leavingID);
|
||||||
if (disconnectedClient != null) GameMain.NetLobbyScreen.RemovePlayer(disconnectedClient.name);
|
|
||||||
|
if (disconnectedClient != null)
|
||||||
|
{
|
||||||
|
otherClients.Remove(disconnectedClient);
|
||||||
|
GameMain.NetLobbyScreen.RemovePlayer(disconnectedClient.name);
|
||||||
|
}
|
||||||
|
|
||||||
if (!gameStarted) return;
|
if (!gameStarted) return;
|
||||||
|
|
||||||
@@ -487,6 +492,9 @@ namespace Barotrauma.Networking
|
|||||||
case (byte)PacketTypes.LatestMessageID:
|
case (byte)PacketTypes.LatestMessageID:
|
||||||
reliableChannel.HandleLatestMessageID(inc);
|
reliableChannel.HandleLatestMessageID(inc);
|
||||||
break;
|
break;
|
||||||
|
case (byte)PacketTypes.VoteStatus:
|
||||||
|
Voting.ReadData(inc);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -512,7 +520,7 @@ namespace Barotrauma.Networking
|
|||||||
yield return CoroutineStatus.Success;
|
yield return CoroutineStatus.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!GameMain.NetLobbyScreen.TrySelectMap(mapName, mapHash))
|
if (!GameMain.NetLobbyScreen.TrySelectSub(mapName, mapHash))
|
||||||
{
|
{
|
||||||
yield return CoroutineStatus.Success;
|
yield return CoroutineStatus.Success;
|
||||||
}
|
}
|
||||||
@@ -522,7 +530,7 @@ namespace Barotrauma.Networking
|
|||||||
Rand.SetSyncedSeed(seed);
|
Rand.SetSyncedSeed(seed);
|
||||||
//int gameModeIndex = inc.ReadInt32();
|
//int gameModeIndex = inc.ReadInt32();
|
||||||
|
|
||||||
GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedMap, "", gameMode);
|
GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode);
|
||||||
|
|
||||||
yield return CoroutineStatus.Running;
|
yield return CoroutineStatus.Running;
|
||||||
|
|
||||||
@@ -637,6 +645,25 @@ namespace Barotrauma.Networking
|
|||||||
GameMain.NetworkMember = null;
|
GameMain.NetworkMember = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void Vote(VoteType voteType, object userData)
|
||||||
|
{
|
||||||
|
NetOutgoingMessage msg = client.CreateMessage();
|
||||||
|
msg.Write((byte)PacketTypes.Vote);
|
||||||
|
msg.Write((byte)voteType);
|
||||||
|
|
||||||
|
switch (voteType)
|
||||||
|
{
|
||||||
|
case VoteType.Sub:
|
||||||
|
msg.Write(((Submarine)userData).Name);
|
||||||
|
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||||
|
break;
|
||||||
|
case VoteType.Mode:
|
||||||
|
msg.Write(((GameModePreset)userData).Name);
|
||||||
|
client.SendMessage(msg, NetDeliveryMethod.ReliableUnordered);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SendCharacterData()
|
public void SendCharacterData()
|
||||||
{
|
{
|
||||||
if (characterInfo == null) return;
|
if (characterInfo == null) return;
|
||||||
|
|||||||
@@ -223,7 +223,6 @@ namespace Barotrauma.Networking
|
|||||||
connectedClients.Find(c => c.character != null && !c.character.IsDead)==null &&
|
connectedClients.Find(c => c.character != null && !c.character.IsDead)==null &&
|
||||||
(myCharacter == null || myCharacter.IsDead))
|
(myCharacter == null || myCharacter.IsDead))
|
||||||
{
|
{
|
||||||
AutoRestartTimer = 20.0f;
|
|
||||||
EndButtonHit(null, null);
|
EndButtonHit(null, null);
|
||||||
UpdateNetLobby(null,null);
|
UpdateNetLobby(null,null);
|
||||||
return;
|
return;
|
||||||
@@ -484,6 +483,9 @@ namespace Barotrauma.Networking
|
|||||||
case (byte)PacketTypes.LatestMessageID:
|
case (byte)PacketTypes.LatestMessageID:
|
||||||
dataSender.ReliableChannel.HandleLatestMessageID(inc);
|
dataSender.ReliableChannel.HandleLatestMessageID(inc);
|
||||||
break;
|
break;
|
||||||
|
case (byte)PacketTypes.Vote:
|
||||||
|
Voting.RegisterVote(inc, connectedClients);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NetIncomingMessageType.WarningMessage:
|
case NetIncomingMessageType.WarningMessage:
|
||||||
@@ -674,7 +676,8 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
public bool StartGameClicked(GUIButton button, object obj)
|
public bool StartGameClicked(GUIButton button, object obj)
|
||||||
{
|
{
|
||||||
Submarine selectedSub = GameMain.NetLobbyScreen.SelectedMap as Submarine;
|
Submarine selectedSub = Voting.AllowSubVoting ?
|
||||||
|
Voting.HighestVoted<Submarine>(VoteType.Sub, connectedClients) : GameMain.NetLobbyScreen.SelectedSub;
|
||||||
|
|
||||||
if (selectedSub == null)
|
if (selectedSub == null)
|
||||||
{
|
{
|
||||||
@@ -695,7 +698,11 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
int seed = DateTime.Now.Millisecond;
|
int seed = DateTime.Now.Millisecond;
|
||||||
Rand.SetSyncedSeed(seed);
|
Rand.SetSyncedSeed(seed);
|
||||||
GameMain.GameSession = new GameSession(selectedSub, "", GameMain.NetLobbyScreen.SelectedMode);
|
|
||||||
|
GameModePreset selectedMode = Voting.HighestVoted<GameModePreset>(VoteType.Mode, connectedClients);
|
||||||
|
if (selectedMode==null) selectedMode=GameMain.NetLobbyScreen.SelectedMode;
|
||||||
|
|
||||||
|
GameMain.GameSession = new GameSession(selectedSub, "", selectedMode);
|
||||||
GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.LevelSeed);
|
GameMain.GameSession.StartShift(GameMain.NetLobbyScreen.LevelSeed);
|
||||||
|
|
||||||
yield return CoroutineStatus.Running;
|
yield return CoroutineStatus.Running;
|
||||||
@@ -747,10 +754,10 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
msg.Write(GameMain.NetLobbyScreen.LevelSeed);
|
msg.Write(GameMain.NetLobbyScreen.LevelSeed);
|
||||||
|
|
||||||
msg.Write(GameMain.NetLobbyScreen.SelectedMap.Name);
|
msg.Write(selectedSub.Name);
|
||||||
msg.Write(GameMain.NetLobbyScreen.SelectedMap.MD5Hash.Hash);
|
msg.Write(selectedSub.MD5Hash.Hash);
|
||||||
|
|
||||||
msg.Write(GameMain.NetLobbyScreen.SelectedMode.Name);
|
msg.Write(selectedMode.Name);
|
||||||
|
|
||||||
//msg.Write(GameMain.NetLobbyScreen.GameDuration.TotalMinutes);
|
//msg.Write(GameMain.NetLobbyScreen.GameDuration.TotalMinutes);
|
||||||
|
|
||||||
@@ -788,6 +795,8 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
GameMain.GameSession.gameMode.End("Server admin has ended the round");
|
GameMain.GameSession.gameMode.End("Server admin has ended the round");
|
||||||
|
|
||||||
|
if (autoRestart) AutoRestartTimer = 20.0f;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1044,6 +1053,27 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdateVoteStatus()
|
||||||
|
{
|
||||||
|
if (server.Connections.Count == 0) return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
NetOutgoingMessage msg = server.CreateMessage();
|
||||||
|
msg.Write((byte)PacketTypes.VoteStatus);
|
||||||
|
Voting.WriteData(msg, connectedClients);
|
||||||
|
|
||||||
|
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
DebugConsole.ThrowError("Failed to update vote status", e);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public bool UpdateNetLobby(object obj)
|
public bool UpdateNetLobby(object obj)
|
||||||
{
|
{
|
||||||
return UpdateNetLobby(null, obj);
|
return UpdateNetLobby(null, obj);
|
||||||
@@ -1051,14 +1081,13 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
public bool UpdateNetLobby(GUIComponent component, object obj)
|
public bool UpdateNetLobby(GUIComponent component, object obj)
|
||||||
{
|
{
|
||||||
|
if (server.Connections.Count == 0) return true;
|
||||||
|
|
||||||
NetOutgoingMessage msg = server.CreateMessage();
|
NetOutgoingMessage msg = server.CreateMessage();
|
||||||
msg.Write((byte)PacketTypes.UpdateNetLobby);
|
msg.Write((byte)PacketTypes.UpdateNetLobby);
|
||||||
GameMain.NetLobbyScreen.WriteData(msg);
|
GameMain.NetLobbyScreen.WriteData(msg);
|
||||||
|
|
||||||
if (server.Connections.Count > 0)
|
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0);
|
||||||
{
|
|
||||||
server.SendMessage(msg, server.Connections, NetDeliveryMethod.ReliableUnordered, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1320,6 +1349,8 @@ namespace Barotrauma.Networking
|
|||||||
public string version;
|
public string version;
|
||||||
public bool inGame;
|
public bool inGame;
|
||||||
|
|
||||||
|
private object[] votes;
|
||||||
|
|
||||||
public List<JobPrefab> jobPreferences;
|
public List<JobPrefab> jobPreferences;
|
||||||
public JobPrefab assignedJob;
|
public JobPrefab assignedJob;
|
||||||
|
|
||||||
@@ -1337,8 +1368,20 @@ namespace Barotrauma.Networking
|
|||||||
{
|
{
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.ID = ID;
|
this.ID = ID;
|
||||||
|
|
||||||
|
votes = new object[Enum.GetNames(typeof(VoteType)).Length];
|
||||||
|
|
||||||
jobPreferences = new List<JobPrefab>(JobPrefab.List.GetRange(0,3));
|
jobPreferences = new List<JobPrefab>(JobPrefab.List.GetRange(0,3));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public object GetVote(VoteType voteType)
|
||||||
|
{
|
||||||
|
return votes[(int)voteType];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetVote(VoteType voteType, object value)
|
||||||
|
{
|
||||||
|
votes[(int)voteType] = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-1
@@ -20,7 +20,7 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
private SelectionMode subSelectionMode, modeSelectionMode;
|
private SelectionMode subSelectionMode, modeSelectionMode;
|
||||||
|
|
||||||
private bool randomizeSeed;
|
private bool randomizeSeed = true;
|
||||||
|
|
||||||
private bool registeredToMaster;
|
private bool registeredToMaster;
|
||||||
|
|
||||||
@@ -108,6 +108,13 @@ namespace Barotrauma.Networking
|
|||||||
((GUITickBox)otherTickBox).Selected = false;
|
((GUITickBox)otherTickBox).Selected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Voting.AllowSubVoting = subSelectionMode == SelectionMode.Vote;
|
||||||
|
|
||||||
|
if (subSelectionMode==SelectionMode.Random)
|
||||||
|
{
|
||||||
|
GameMain.NetLobbyScreen.SubList.Select(Rand.Range(0, GameMain.NetLobbyScreen.SubList.CountChildren));
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -121,6 +128,13 @@ namespace Barotrauma.Networking
|
|||||||
((GUITickBox)otherTickBox).Selected = false;
|
((GUITickBox)otherTickBox).Selected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Voting.AllowModeVoting = modeSelectionMode == SelectionMode.Vote;
|
||||||
|
|
||||||
|
if (modeSelectionMode == SelectionMode.Random)
|
||||||
|
{
|
||||||
|
GameMain.NetLobbyScreen.ModeList.Select(Rand.Range(0, GameMain.NetLobbyScreen.ModeList.CountChildren));
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,10 +30,20 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
Traitor,
|
Traitor,
|
||||||
|
|
||||||
|
Vote,
|
||||||
|
VoteStatus,
|
||||||
|
|
||||||
ResendRequest,
|
ResendRequest,
|
||||||
ReliableMessage,
|
ReliableMessage,
|
||||||
LatestMessageID
|
LatestMessageID
|
||||||
|
}
|
||||||
|
|
||||||
|
enum VoteType
|
||||||
|
{
|
||||||
|
Unknown,
|
||||||
|
Sub,
|
||||||
|
Mode,
|
||||||
|
EndRound
|
||||||
}
|
}
|
||||||
|
|
||||||
class NetworkMember
|
class NetworkMember
|
||||||
@@ -61,6 +71,8 @@ namespace Barotrauma.Networking
|
|||||||
protected Character myCharacter;
|
protected Character myCharacter;
|
||||||
protected CharacterInfo characterInfo;
|
protected CharacterInfo characterInfo;
|
||||||
|
|
||||||
|
public Voting Voting;
|
||||||
|
|
||||||
public Character Character
|
public Character Character
|
||||||
{
|
{
|
||||||
get { return myCharacter; }
|
get { return myCharacter; }
|
||||||
@@ -113,6 +125,8 @@ namespace Barotrauma.Networking
|
|||||||
|
|
||||||
crewButton = new GUIButton(new Rectangle(chatBox.Rect.Right-80, chatBox.Rect.Y-30, 80, 20), "Crew", GUI.Style, inGameHUD);
|
crewButton = new GUIButton(new Rectangle(chatBox.Rect.Right-80, chatBox.Rect.Y-30, 80, 20), "Crew", GUI.Style, inGameHUD);
|
||||||
crewButton.OnClicked = ToggleCrewFrame;
|
crewButton.OnClicked = ToggleCrewFrame;
|
||||||
|
|
||||||
|
Voting = new Voting();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void CreateCrewFrame(List<Character> crew)
|
protected void CreateCrewFrame(List<Character> crew)
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ namespace Barotrauma
|
|||||||
if (PlayerInput.KeyDown(Keys.J)) targetMovement.X -= 1.0f;
|
if (PlayerInput.KeyDown(Keys.J)) targetMovement.X -= 1.0f;
|
||||||
if (PlayerInput.KeyDown(Keys.L)) targetMovement.X += 1.0f;
|
if (PlayerInput.KeyDown(Keys.L)) targetMovement.X += 1.0f;
|
||||||
|
|
||||||
GameMain.GameSession.Submarine.ApplyForce(targetMovement * 100000.0f);
|
GameMain.GameSession.Submarine.ApplyForce(targetMovement * 1000000.0f);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
dustOffset -= Vector2.UnitY * 10.0f * (float)deltaTime;
|
dustOffset -= Vector2.UnitY * 10.0f * (float)deltaTime;
|
||||||
@@ -213,11 +213,11 @@ namespace Barotrauma
|
|||||||
viewRect.Y = -viewRect.Y;
|
viewRect.Y = -viewRect.Y;
|
||||||
|
|
||||||
float multiplier = 0.8f;
|
float multiplier = 0.8f;
|
||||||
for (int i = 1; i < 3; i++)
|
for (int i = 1; i < 4; i++)
|
||||||
{
|
{
|
||||||
spriteBatch.Draw(dustParticles, viewRect,
|
spriteBatch.Draw(dustParticles, viewRect,
|
||||||
new Rectangle((int)((backgroundPos.X * multiplier)), (int)((-backgroundPos.Y * multiplier)), cam.WorldView.Width, cam.WorldView.Height),
|
new Rectangle((int)((backgroundPos.X * multiplier)), (int)((-backgroundPos.Y * multiplier)), cam.WorldView.Width, cam.WorldView.Height),
|
||||||
Color.LightGray * multiplier, 0.0f, Vector2.Zero, SpriteEffects.None, 1.0f-multiplier);
|
Color.White * multiplier, 0.0f, Vector2.Zero, SpriteEffects.None, 1.0f-multiplier);
|
||||||
multiplier -= 0.15f;
|
multiplier -= 0.15f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,14 +58,14 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
Rectangle panelRect = new Rectangle(
|
Rectangle panelRect = new Rectangle(
|
||||||
40, 40,
|
40, 40,
|
||||||
180,
|
GameMain.GraphicsWidth < 1000 ? 140 : 180,
|
||||||
GameMain.GraphicsHeight - 80);
|
GameMain.GraphicsHeight - 80);
|
||||||
|
|
||||||
leftPanel = new GUIFrame(panelRect, GUI.Style);
|
leftPanel = new GUIFrame(panelRect, GUI.Style);
|
||||||
//leftPanel.Padding = GUI.style.smallPadding;
|
leftPanel.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 0, 200, 25),
|
//new GUITextBlock(new Rectangle(0, 0, 200, 25),
|
||||||
"asdfdasfasdf", Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel);
|
// save, Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel);
|
||||||
|
|
||||||
GUITextBlock moneyText = new GUITextBlock(new Rectangle(0, 30, 200, 25),
|
GUITextBlock moneyText = new GUITextBlock(new Rectangle(0, 30, 200, 25),
|
||||||
"", Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel);
|
"", Color.Transparent, Color.White, Alignment.Left, GUI.Style, leftPanel);
|
||||||
@@ -100,17 +100,18 @@ namespace Barotrauma
|
|||||||
rightPanel = new GUIFrame[4];
|
rightPanel = new GUIFrame[4];
|
||||||
|
|
||||||
rightPanel[(int)PanelTab.Crew] = new GUIFrame(panelRect, GUI.Style);
|
rightPanel[(int)PanelTab.Crew] = new GUIFrame(panelRect, GUI.Style);
|
||||||
//rightPanel[(int)PanelTab.Crew].Padding = GUI.style.smallPadding;
|
rightPanel[(int)PanelTab.Crew].Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 0, 200, 25), "Crew:", Color.Transparent, Color.White, Alignment.Left, GUI.Style, rightPanel[(int)PanelTab.Crew]);
|
new GUITextBlock(new Rectangle(0, 0, 200, 25), "Crew:", Color.Transparent, Color.White, Alignment.Left, GUI.Style, rightPanel[(int)PanelTab.Crew]);
|
||||||
|
|
||||||
characterList = new GUIListBox(new Rectangle(0, 30, 300, 0), GUI.Style, rightPanel[(int)PanelTab.Crew]);
|
int crewColumnWidth = Math.Min(300, (panelRect.Width - 40) / 2);
|
||||||
|
characterList = new GUIListBox(new Rectangle(0, 30, crewColumnWidth, 0), GUI.Style, rightPanel[(int)PanelTab.Crew]);
|
||||||
characterList.OnSelected = SelectCharacter;
|
characterList.OnSelected = SelectCharacter;
|
||||||
|
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
|
|
||||||
rightPanel[(int)PanelTab.Map] = new GUIFrame(panelRect, GUI.Style);
|
rightPanel[(int)PanelTab.Map] = new GUIFrame(panelRect, GUI.Style);
|
||||||
//rightPanel[(int)PanelTab.Map].Padding = GUI.style.smallPadding;
|
rightPanel[(int)PanelTab.Map].Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|
||||||
startButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Start",
|
startButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Start",
|
||||||
Alignment.BottomRight, GUI.Style, rightPanel[(int)PanelTab.Map]);
|
Alignment.BottomRight, GUI.Style, rightPanel[(int)PanelTab.Map]);
|
||||||
@@ -124,17 +125,20 @@ namespace Barotrauma
|
|||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
|
|
||||||
rightPanel[(int)PanelTab.Store] = new GUIFrame(panelRect, GUI.Style);
|
rightPanel[(int)PanelTab.Store] = new GUIFrame(panelRect, GUI.Style);
|
||||||
|
rightPanel[(int)PanelTab.Store].Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|
||||||
selectedItemList = new GUIListBox(new Rectangle(0, 0, 300, 400), Color.White * 0.7f, GUI.Style, rightPanel[(int)PanelTab.Store]);
|
int sellColumnWidth = (panelRect.Width - 40) / 2 - 20;
|
||||||
|
|
||||||
|
selectedItemList = new GUIListBox(new Rectangle(0, 0, sellColumnWidth, 400), Color.White * 0.7f, GUI.Style, rightPanel[(int)PanelTab.Store]);
|
||||||
selectedItemList.OnSelected = DeselectItem;
|
selectedItemList.OnSelected = DeselectItem;
|
||||||
|
|
||||||
var costText = new GUITextBlock(new Rectangle(0, 0, 200, 25), "Cost: ", GUI.Style, Alignment.BottomLeft, Alignment.TopLeft, rightPanel[(int)PanelTab.Store]);
|
var costText = new GUITextBlock(new Rectangle(0, 0, 100, 25), "Cost: ", GUI.Style, Alignment.BottomLeft, Alignment.TopLeft, rightPanel[(int)PanelTab.Store]);
|
||||||
costText.TextGetter = CostTextGetter;
|
costText.TextGetter = CostTextGetter;
|
||||||
|
|
||||||
buyButton = new GUIButton(new Rectangle(150, 0, 100, 25), "Buy", Alignment.Bottom, GUI.Style, rightPanel[(int)PanelTab.Store]);
|
buyButton = new GUIButton(new Rectangle(sellColumnWidth+20, 0, 100, 25), "Buy", Alignment.Bottom, GUI.Style, rightPanel[(int)PanelTab.Store]);
|
||||||
buyButton.OnClicked = BuyItems;
|
buyButton.OnClicked = BuyItems;
|
||||||
|
|
||||||
itemList = new GUIListBox(new Rectangle(0, 0, 300, 400), Color.White * 0.7f, Alignment.TopRight, GUI.Style, rightPanel[(int)PanelTab.Store]);
|
itemList = new GUIListBox(new Rectangle(0, 0, sellColumnWidth, 400), Color.White * 0.7f, Alignment.TopRight, GUI.Style, rightPanel[(int)PanelTab.Store]);
|
||||||
itemList.OnSelected = SelectItem;
|
itemList.OnSelected = SelectItem;
|
||||||
|
|
||||||
foreach (MapEntityPrefab ep in MapEntityPrefab.list)
|
foreach (MapEntityPrefab ep in MapEntityPrefab.list)
|
||||||
@@ -237,7 +241,7 @@ namespace Barotrauma
|
|||||||
c.Name + " (" + c.Job.Name + ")", GUI.Style,
|
c.Name + " (" + c.Job.Name + ")", GUI.Style,
|
||||||
Alignment.Left,
|
Alignment.Left,
|
||||||
Alignment.Left,
|
Alignment.Left,
|
||||||
characterList);
|
characterList, false, GameMain.GraphicsWidth<1000 ? GUI.SmallFont : GUI.Font);
|
||||||
textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f);
|
textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f);
|
||||||
textBlock.UserData = c;
|
textBlock.UserData = c;
|
||||||
}
|
}
|
||||||
@@ -254,12 +258,15 @@ namespace Barotrauma
|
|||||||
frame.HoverColor = Color.Gold * 0.2f;
|
frame.HoverColor = Color.Gold * 0.2f;
|
||||||
frame.SelectedColor = Color.Gold * 0.5f;
|
frame.SelectedColor = Color.Gold * 0.5f;
|
||||||
|
|
||||||
|
SpriteFont font = listBox.Rect.Width < 280 ? GUI.SmallFont : GUI.Font;
|
||||||
|
|
||||||
GUITextBlock textBlock = new GUITextBlock(
|
GUITextBlock textBlock = new GUITextBlock(
|
||||||
new Rectangle(40, 0, 0, 25),
|
new Rectangle(40, 0, 0, 25),
|
||||||
ep.Name,
|
ep.Name,
|
||||||
Color.Transparent, Color.White,
|
Color.Transparent, Color.White,
|
||||||
Alignment.Left, Alignment.Left,
|
Alignment.Left, Alignment.Left,
|
||||||
null, frame);
|
null, frame);
|
||||||
|
textBlock.Font = font;
|
||||||
textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f);
|
textBlock.Padding = new Vector4(5.0f, 0.0f, 5.0f, 0.0f);
|
||||||
|
|
||||||
textBlock = new GUITextBlock(
|
textBlock = new GUITextBlock(
|
||||||
@@ -267,6 +274,7 @@ namespace Barotrauma
|
|||||||
ep.Price.ToString(),
|
ep.Price.ToString(),
|
||||||
null, null,
|
null, null,
|
||||||
Alignment.TopRight, GUI.Style, textBlock);
|
Alignment.TopRight, GUI.Style, textBlock);
|
||||||
|
textBlock.Font = font;
|
||||||
|
|
||||||
if (ep.sprite != null)
|
if (ep.sprite != null)
|
||||||
{
|
{
|
||||||
@@ -410,7 +418,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (previewFrame == null || previewFrame.UserData != characterInfo)
|
if (previewFrame == null || previewFrame.UserData != characterInfo)
|
||||||
{
|
{
|
||||||
previewFrame = new GUIFrame(new Rectangle(350, 60, 300, 300),
|
previewFrame = new GUIFrame(new Rectangle(rightPanel[(int)PanelTab.Crew].Rect.Width/2, 60, Math.Min(300,rightPanel[(int)PanelTab.Crew].Rect.Width/2 - 40), 300),
|
||||||
new Color(0.0f, 0.0f, 0.0f, 0.8f),
|
new Color(0.0f, 0.0f, 0.0f, 0.8f),
|
||||||
Alignment.Top, GUI.Style, rightPanel[selectedRightPanel]);
|
Alignment.Top, GUI.Style, rightPanel[selectedRightPanel]);
|
||||||
previewFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
previewFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
class NetLobbyScreen : Screen
|
partial class NetLobbyScreen : Screen
|
||||||
{
|
{
|
||||||
private GUIFrame menu;
|
private GUIFrame menu;
|
||||||
private GUIFrame infoFrame;
|
private GUIFrame infoFrame;
|
||||||
@@ -43,7 +43,17 @@ namespace Barotrauma
|
|||||||
get { return subList; }
|
get { return subList; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Submarine SelectedMap
|
public GUIListBox ModeList
|
||||||
|
{
|
||||||
|
get { return modeList; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public GUIFrame InfoFrame
|
||||||
|
{
|
||||||
|
get { return infoFrame; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public Submarine SelectedSub
|
||||||
{
|
{
|
||||||
get { return subList.SelectedData as Submarine; }
|
get { return subList.SelectedData as Submarine; }
|
||||||
}
|
}
|
||||||
@@ -105,7 +115,7 @@ namespace Barotrauma
|
|||||||
if (autoRestartTimer == 0.0f) return "";
|
if (autoRestartTimer == 0.0f) return "";
|
||||||
return "Restarting in " + (int)autoRestartTimer;
|
return "Restarting in " + (int)autoRestartTimer;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetLobbyScreen()
|
public NetLobbyScreen()
|
||||||
{
|
{
|
||||||
int width = Math.Min(GameMain.GraphicsWidth - 80, 1500);
|
int width = Math.Min(GameMain.GraphicsWidth - 80, 1500);
|
||||||
@@ -156,12 +166,16 @@ namespace Barotrauma
|
|||||||
|
|
||||||
//submarine list ------------------------------------------------------------------
|
//submarine list ------------------------------------------------------------------
|
||||||
|
|
||||||
int columnWidth = infoFrame.Rect.Width / 5 - 30;
|
int columnWidth = infoFrame.Rect.Width / 3 - 5;
|
||||||
int columnX = 0;
|
int columnX = 0;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 30), "Submarine:", GUI.Style, infoFrame);
|
new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 30), "Submarine:", GUI.Style, infoFrame);
|
||||||
subList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), Color.White, GUI.Style, infoFrame);
|
subList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), Color.White, GUI.Style, infoFrame);
|
||||||
subList.OnSelected = SelectMap;
|
subList.OnSelected = VotableClicked;
|
||||||
|
|
||||||
|
var voteText = new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 30), "Votes: ", GUI.Style, Alignment.TopLeft, Alignment.TopRight, infoFrame);
|
||||||
|
voteText.UserData = "subvotes";
|
||||||
|
voteText.Visible = false;
|
||||||
|
|
||||||
if (Submarine.SavedSubmarines.Count > 0)
|
if (Submarine.SavedSubmarines.Count > 0)
|
||||||
{
|
{
|
||||||
@@ -188,8 +202,13 @@ namespace Barotrauma
|
|||||||
|
|
||||||
new GUITextBlock(new Rectangle(columnX, 120, 0, 30), "Game mode: ", GUI.Style, infoFrame);
|
new GUITextBlock(new Rectangle(columnX, 120, 0, 30), "Game mode: ", GUI.Style, infoFrame);
|
||||||
modeList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), GUI.Style, infoFrame);
|
modeList = new GUIListBox(new Rectangle(columnX, 150, columnWidth, infoFrame.Rect.Height - 150 - 80), GUI.Style, infoFrame);
|
||||||
|
modeList.OnSelected = VotableClicked;
|
||||||
|
|
||||||
|
|
||||||
|
voteText = new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 30), "Votes: ", GUI.Style, Alignment.TopLeft, Alignment.TopRight, infoFrame);
|
||||||
|
voteText.UserData = "modevotes";
|
||||||
|
voteText.Visible = false;
|
||||||
|
|
||||||
foreach (GameModePreset mode in GameModePreset.list)
|
foreach (GameModePreset mode in GameModePreset.list)
|
||||||
{
|
{
|
||||||
if (mode.IsSinglePlayer) continue;
|
if (mode.IsSinglePlayer) continue;
|
||||||
@@ -199,29 +218,31 @@ namespace Barotrauma
|
|||||||
mode.Name, GUI.Style,
|
mode.Name, GUI.Style,
|
||||||
Alignment.Left, Alignment.Left,
|
Alignment.Left, Alignment.Left,
|
||||||
modeList);
|
modeList);
|
||||||
|
textBlock.ToolTip = mode.Description;
|
||||||
textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f);
|
textBlock.Padding = new Vector4(10.0f, 0.0f, 0.0f, 0.0f);
|
||||||
textBlock.UserData = mode;
|
textBlock.UserData = mode;
|
||||||
}
|
}
|
||||||
|
|
||||||
columnX += columnWidth;
|
|
||||||
|
columnX += columnWidth + 20;
|
||||||
|
|
||||||
//gamemode description ------------------------------------------------------------------
|
//gamemode description ------------------------------------------------------------------
|
||||||
|
|
||||||
var modeDescription = new GUITextBlock(
|
//var modeDescription = new GUITextBlock(
|
||||||
new Rectangle(columnX, 150, (int)(columnWidth * 1.5f), infoFrame.Rect.Height - 150 - 80),
|
// new Rectangle(columnX, 150, (int)(columnWidth * 1.2f), infoFrame.Rect.Height - 150 - 80),
|
||||||
"", GUI.Style, Alignment.TopLeft, Alignment.TopLeft, infoFrame, true, GameMain.GraphicsWidth>1024 ? GUI.Font : GUI.SmallFont);
|
// "", GUI.Style, Alignment.TopLeft, Alignment.TopLeft, infoFrame, true, GUI.SmallFont);
|
||||||
modeDescription.Color = Color.Black * 0.3f;
|
//modeDescription.Color = Color.Black * 0.3f;
|
||||||
|
|
||||||
modeList.UserData = modeDescription;
|
//modeList.UserData = modeDescription;
|
||||||
|
|
||||||
columnX += modeDescription.Rect.Width + 40;
|
//columnX += modeDescription.Rect.Width + 20;
|
||||||
|
|
||||||
//seed ------------------------------------------------------------------
|
//seed ------------------------------------------------------------------
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(columnX, 120, columnWidth, 20),
|
new GUITextBlock(new Rectangle(columnX, 120, 180, 20),
|
||||||
"Level Seed: ", GUI.Style, Alignment.Left, Alignment.TopLeft, infoFrame);
|
"Level Seed: ", GUI.Style, Alignment.Left, Alignment.TopLeft, infoFrame);
|
||||||
|
|
||||||
seedBox = new GUITextBox(new Rectangle(columnX, 150, columnWidth, 20),
|
seedBox = new GUITextBox(new Rectangle(columnX, 150, columnWidth/2, 20),
|
||||||
Alignment.TopLeft, GUI.Style, infoFrame);
|
Alignment.TopLeft, GUI.Style, infoFrame);
|
||||||
seedBox.OnTextChanged = SelectSeed;
|
seedBox.OnTextChanged = SelectSeed;
|
||||||
LevelSeed = ToolBox.RandomSeed(8);
|
LevelSeed = ToolBox.RandomSeed(8);
|
||||||
@@ -264,16 +285,16 @@ namespace Barotrauma
|
|||||||
|
|
||||||
Character.Controlled = null;
|
Character.Controlled = null;
|
||||||
GameMain.GameScreen.Cam.TargetPos = Vector2.Zero;
|
GameMain.GameScreen.Cam.TargetPos = Vector2.Zero;
|
||||||
|
|
||||||
subList.Enabled = GameMain.Server != null;
|
subList.Enabled = GameMain.Server != null || GameMain.NetworkMember.Voting.AllowSubVoting;
|
||||||
playerList.Enabled = GameMain.Server != null;
|
playerList.Enabled = GameMain.Server != null;
|
||||||
modeList.Enabled = GameMain.Server != null;
|
modeList.Enabled = GameMain.Server != null || GameMain.NetworkMember.Voting.AllowModeVoting;
|
||||||
seedBox.Enabled = GameMain.Server != null;
|
seedBox.Enabled = GameMain.Server != null;
|
||||||
serverMessage.Enabled = GameMain.Server != null;
|
serverMessage.Enabled = GameMain.Server != null;
|
||||||
autoRestartBox.Enabled = GameMain.Server != null;
|
autoRestartBox.Enabled = GameMain.Server != null;
|
||||||
ServerName = (GameMain.Server==null) ? "Server" : GameMain.Server.Name;
|
ServerName = (GameMain.Server==null) ? "Server" : GameMain.Server.Name;
|
||||||
|
|
||||||
modeList.OnSelected += SelectMode;
|
|
||||||
|
|
||||||
infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "startButton"));
|
infoFrame.RemoveChild(infoFrame.children.Find(c => c.UserData as string == "startButton"));
|
||||||
|
|
||||||
@@ -281,6 +302,11 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (IsServer && GameMain.Server != null)
|
if (IsServer && GameMain.Server != null)
|
||||||
{
|
{
|
||||||
|
modeList.OnSelected = VotableClicked;
|
||||||
|
modeList.OnSelected += SelectMode;
|
||||||
|
subList.OnSelected = VotableClicked;
|
||||||
|
subList.OnSelected += SelectMode;
|
||||||
|
|
||||||
GUIButton startButton = new GUIButton(new Rectangle(0, 0, 80, 30), "Start", Alignment.BottomRight, GUI.Style, infoFrame);
|
GUIButton startButton = new GUIButton(new Rectangle(0, 0, 80, 30), "Start", Alignment.BottomRight, GUI.Style, infoFrame);
|
||||||
startButton.OnClicked = GameMain.Server.StartGameClicked;
|
startButton.OnClicked = GameMain.Server.StartGameClicked;
|
||||||
startButton.UserData = "startButton";
|
startButton.UserData = "startButton";
|
||||||
@@ -294,7 +320,7 @@ namespace Barotrauma
|
|||||||
banListButton.UserData = "banListButton";
|
banListButton.UserData = "banListButton";
|
||||||
|
|
||||||
//mapList.OnSelected = new GUIListBox.OnSelectedHandler(Game1.server.UpdateNetLobby);
|
//mapList.OnSelected = new GUIListBox.OnSelectedHandler(Game1.server.UpdateNetLobby);
|
||||||
modeList.OnSelected += GameMain.Server.UpdateNetLobby;
|
//modeList.OnSelected += GameMain.Server.UpdateNetLobby;
|
||||||
|
|
||||||
if (subList.CountChildren > 0 && subList.Selected == null) subList.Select(-1);
|
if (subList.CountChildren > 0 && subList.Selected == null) subList.Select(-1);
|
||||||
if (GameModePreset.list.Count > 0 && modeList.Selected == null) modeList.Select(-1);
|
if (GameModePreset.list.Count > 0 && modeList.Selected == null) modeList.Select(-1);
|
||||||
@@ -339,21 +365,21 @@ namespace Barotrauma
|
|||||||
playerName.Text = characterInfo.Name;
|
playerName.Text = characterInfo.Name;
|
||||||
playerName.OnEnterPressed += ChangeCharacterName;
|
playerName.OnEnterPressed += ChangeCharacterName;
|
||||||
|
|
||||||
GUIButton toggleHead = new GUIButton(new Rectangle(0, 50, 20, 20), "<", GUI.Style, myPlayerFrame);
|
GUIButton toggleHead = new GUIButton(new Rectangle(0, 50, 15, 15), "<", GUI.Style, myPlayerFrame);
|
||||||
toggleHead.UserData = -1;
|
toggleHead.UserData = -1;
|
||||||
toggleHead.OnClicked = ToggleHead;
|
toggleHead.OnClicked = ToggleHead;
|
||||||
toggleHead = new GUIButton(new Rectangle(60, 50, 20, 20), ">", GUI.Style, myPlayerFrame);
|
toggleHead = new GUIButton(new Rectangle(60, 50, 15, 15), ">", GUI.Style, myPlayerFrame);
|
||||||
toggleHead.UserData = 1;
|
toggleHead.UserData = 1;
|
||||||
toggleHead.OnClicked = ToggleHead;
|
toggleHead.OnClicked = ToggleHead;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(0, 100, 200, 30), "Gender: ", GUI.Style, myPlayerFrame);
|
new GUITextBlock(new Rectangle(0, 90, 200, 30), "Gender: ", GUI.Style, myPlayerFrame);
|
||||||
|
|
||||||
GUIButton maleButton = new GUIButton(new Rectangle(70, 100, 60, 20), "Male",
|
GUIButton maleButton = new GUIButton(new Rectangle(0, 110, 60, 20), "Male",
|
||||||
Alignment.TopLeft, GUI.Style, myPlayerFrame);
|
Alignment.TopLeft, GUI.Style, myPlayerFrame);
|
||||||
maleButton.UserData = Gender.Male;
|
maleButton.UserData = Gender.Male;
|
||||||
maleButton.OnClicked += SwitchGender;
|
maleButton.OnClicked += SwitchGender;
|
||||||
|
|
||||||
GUIButton femaleButton = new GUIButton(new Rectangle(140, 100, 60, 20), "Female",
|
GUIButton femaleButton = new GUIButton(new Rectangle(70, 110, 60, 20), "Female",
|
||||||
Alignment.TopLeft, GUI.Style, myPlayerFrame);
|
Alignment.TopLeft, GUI.Style, myPlayerFrame);
|
||||||
femaleButton.UserData = Gender.Female;
|
femaleButton.UserData = Gender.Female;
|
||||||
femaleButton.OnClicked += SwitchGender;
|
femaleButton.OnClicked += SwitchGender;
|
||||||
@@ -367,7 +393,9 @@ namespace Barotrauma
|
|||||||
int i = 1;
|
int i = 1;
|
||||||
foreach (JobPrefab job in JobPrefab.List)
|
foreach (JobPrefab job in JobPrefab.List)
|
||||||
{
|
{
|
||||||
GUITextBlock jobText = new GUITextBlock(new Rectangle(0, 0, 0, 20), i + ". " + job.Name+" ", GUI.Style, Alignment.Left, Alignment.Right, jobList);
|
GUITextBlock jobText = new GUITextBlock(new Rectangle(0, 0, 0, 20), i + ". " + job.Name+" ",
|
||||||
|
GUI.Style,Alignment.Left, Alignment.Right, jobList, false,
|
||||||
|
GameMain.GraphicsWidth<1000 ? GUI.SmallFont : GUI.Font);
|
||||||
jobText.UserData = job;
|
jobText.UserData = job;
|
||||||
|
|
||||||
GUIButton infoButton = new GUIButton(new Rectangle(0, 0, 15, 15), "?", GUI.Style, jobText);
|
GUIButton infoButton = new GUIButton(new Rectangle(0, 0, 15, 15), "?", GUI.Style, jobText);
|
||||||
@@ -439,6 +467,31 @@ namespace Barotrauma
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool VotableClicked(GUIComponent component, object userData)
|
||||||
|
{
|
||||||
|
if (GameMain.Client == null) return false;
|
||||||
|
|
||||||
|
VoteType voteType = VoteType.Unknown;
|
||||||
|
if (component.Parent == GameMain.NetLobbyScreen.SubList)
|
||||||
|
{
|
||||||
|
if (!GameMain.Client.Voting.AllowSubVoting) return false;
|
||||||
|
voteType = VoteType.Sub;
|
||||||
|
}
|
||||||
|
else if (component.Parent == GameMain.NetLobbyScreen.ModeList)
|
||||||
|
{
|
||||||
|
if (!GameMain.Client.Voting.AllowModeVoting) return false;
|
||||||
|
voteType = VoteType.Mode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameMain.Client.Vote(voteType, userData);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
public bool ChangeServerName(GUITextBox textBox, string text)
|
public bool ChangeServerName(GUITextBox textBox, string text)
|
||||||
{
|
{
|
||||||
if (GameMain.Server == null) return false;
|
if (GameMain.Server == null) return false;
|
||||||
@@ -581,7 +634,7 @@ namespace Barotrauma
|
|||||||
spriteBatch.Begin();
|
spriteBatch.Begin();
|
||||||
|
|
||||||
menu.Draw(spriteBatch);
|
menu.Draw(spriteBatch);
|
||||||
|
|
||||||
if (jobInfoFrame != null) jobInfoFrame.Draw(spriteBatch);
|
if (jobInfoFrame != null) jobInfoFrame.Draw(spriteBatch);
|
||||||
|
|
||||||
//if (previewPlayer!=null) previewPlayer.Draw(spriteBatch);
|
//if (previewPlayer!=null) previewPlayer.Draw(spriteBatch);
|
||||||
@@ -664,15 +717,16 @@ namespace Barotrauma
|
|||||||
|
|
||||||
private bool SelectMode(GUIComponent component, object obj)
|
private bool SelectMode(GUIComponent component, object obj)
|
||||||
{
|
{
|
||||||
|
if (GameMain.NetworkMember == null) return false;
|
||||||
|
|
||||||
|
//if (GameMain.Server==null)
|
||||||
|
//{
|
||||||
|
// return VotableClicked(component, obj);
|
||||||
|
//}
|
||||||
|
|
||||||
GameModePreset modePreset = obj as GameModePreset;
|
GameModePreset modePreset = obj as GameModePreset;
|
||||||
if (modePreset == null) return false;
|
if (modePreset == null) return false;
|
||||||
|
|
||||||
GUITextBlock description = modeList.UserData as GUITextBlock;
|
|
||||||
|
|
||||||
description.Text = modePreset.Description;
|
|
||||||
|
|
||||||
//if (Game1.Server != null) Game1.Server.UpdateNetLobby(null);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -767,34 +821,34 @@ namespace Barotrauma
|
|||||||
if (GameMain.Client!=null) GameMain.Client.SendCharacterData();
|
if (GameMain.Client!=null) GameMain.Client.SendCharacterData();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TrySelectMap(string mapName, string md5Hash)
|
public bool TrySelectSub(string subName, string md5Hash)
|
||||||
{
|
{
|
||||||
|
|
||||||
Submarine map = Submarine.SavedSubmarines.Find(m => m.Name == mapName);
|
Submarine sub = Submarine.SavedSubmarines.Find(m => m.Name == subName);
|
||||||
if (map == null)
|
if (sub == null)
|
||||||
{
|
{
|
||||||
new GUIMessageBox("Submarine not found!","The submarine ''" + mapName + "'' has been selected by the server. Matching file not found in your map folder.");
|
new GUIMessageBox("Submarine not found!","The submarine ''" + subName + "'' has been selected by the server. Matching file not found in your map folder.");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (map.MD5Hash.Hash != md5Hash)
|
if (sub.MD5Hash.Hash != md5Hash)
|
||||||
{
|
{
|
||||||
new GUIMessageBox("Submarine not found!",
|
new GUIMessageBox("Submarine not found!",
|
||||||
"Your version of the map file ''" + map.Name + "'' doesn't match the server's version!"
|
"Your version of the map file ''" + sub.Name + "'' doesn't match the server's version!"
|
||||||
+"\nYour file: " + map.Name + "(MD5 hash : " + map.MD5Hash.Hash + ")"
|
+"\nYour file: " + sub.Name + "(MD5 hash : " + sub.MD5Hash.Hash + ")"
|
||||||
+"\nServer's file: " + mapName + "(MD5 hash : " + md5Hash + ")");
|
+"\nServer's file: " + subName + "(MD5 hash : " + md5Hash + ")");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
subList.Select(map);
|
subList.Select(sub);
|
||||||
//map.Load();
|
//map.Load();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void WriteData(NetOutgoingMessage msg)
|
public void WriteData(NetOutgoingMessage msg)
|
||||||
{
|
{
|
||||||
Submarine selectedMap = subList.SelectedData as Submarine;
|
Submarine selectedMap = subList.SelectedData as Submarine;
|
||||||
@@ -813,6 +867,9 @@ namespace Barotrauma
|
|||||||
msg.Write(ServerName);
|
msg.Write(ServerName);
|
||||||
msg.Write(ServerMessage);
|
msg.Write(ServerMessage);
|
||||||
|
|
||||||
|
//msg.Write(AllowSubVoting);
|
||||||
|
//msg.Write(AllowModeVoting);
|
||||||
|
|
||||||
msg.Write(modeList.SelectedIndex-1);
|
msg.Write(modeList.SelectedIndex-1);
|
||||||
//msg.Write(durationBar.BarScroll);
|
//msg.Write(durationBar.BarScroll);
|
||||||
msg.Write(LevelSeed);
|
msg.Write(LevelSeed);
|
||||||
@@ -828,8 +885,6 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void ReadData(NetIncomingMessage msg)
|
public void ReadData(NetIncomingMessage msg)
|
||||||
{
|
{
|
||||||
string mapName="", md5Hash="";
|
string mapName="", md5Hash="";
|
||||||
@@ -844,20 +899,23 @@ namespace Barotrauma
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
mapName = msg.ReadString();
|
mapName = msg.ReadString();
|
||||||
md5Hash = msg.ReadString();
|
md5Hash = msg.ReadString();
|
||||||
|
|
||||||
ServerName = msg.ReadString();
|
ServerName = msg.ReadString();
|
||||||
ServerMessage = msg.ReadString();
|
ServerMessage = msg.ReadString();
|
||||||
|
|
||||||
modeIndex = msg.ReadInt32();
|
//AllowSubVoting = msg.ReadBoolean();
|
||||||
|
//AllowModeVoting = msg.ReadBoolean();
|
||||||
|
|
||||||
|
modeIndex = msg.ReadInt32();
|
||||||
|
|
||||||
//durationScroll = msg.ReadFloat();
|
//durationScroll = msg.ReadFloat();
|
||||||
|
|
||||||
levelSeed = msg.ReadString();
|
levelSeed = msg.ReadString();
|
||||||
|
|
||||||
autoRestart = msg.ReadBoolean();
|
autoRestart = msg.ReadBoolean();
|
||||||
restartTimer = msg.ReadFloat();
|
restartTimer = msg.ReadFloat();
|
||||||
|
|
||||||
int playerCount = msg.ReadByte();
|
int playerCount = msg.ReadByte();
|
||||||
|
|
||||||
@@ -873,9 +931,9 @@ namespace Barotrauma
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(mapName)) TrySelectMap(mapName, md5Hash);
|
if (!string.IsNullOrWhiteSpace(mapName) && !GameMain.NetworkMember.Voting.AllowSubVoting) TrySelectSub(mapName, md5Hash);
|
||||||
|
|
||||||
modeList.Select(modeIndex);
|
if (!GameMain.NetworkMember.Voting.AllowModeVoting) modeList.Select(modeIndex);
|
||||||
|
|
||||||
autoRestartBox.Selected = autoRestart;
|
autoRestartBox.Selected = autoRestart;
|
||||||
autoRestartTimer = restartTimer;
|
autoRestartTimer = restartTimer;
|
||||||
|
|||||||
@@ -0,0 +1,234 @@
|
|||||||
|
using Barotrauma.Networking;
|
||||||
|
using Lidgren.Network;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace Barotrauma
|
||||||
|
{
|
||||||
|
class Voting
|
||||||
|
{
|
||||||
|
private bool allowSubVoting, allowModeVoting;
|
||||||
|
|
||||||
|
public bool AllowSubVoting
|
||||||
|
{
|
||||||
|
get { return allowSubVoting; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == allowSubVoting) return;
|
||||||
|
allowSubVoting = value;
|
||||||
|
GameMain.NetLobbyScreen.SubList.Enabled = value || GameMain.Server != null;
|
||||||
|
GameMain.NetLobbyScreen.InfoFrame.FindChild("subvotes").Visible = value;
|
||||||
|
|
||||||
|
if (GameMain.Server != null)
|
||||||
|
{
|
||||||
|
UpdateVoteTexts(GameMain.Server.connectedClients, VoteType.Sub);
|
||||||
|
GameMain.Server.UpdateVoteStatus();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GameMain.NetLobbyScreen.SubList.Deselect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public bool AllowModeVoting
|
||||||
|
{
|
||||||
|
get { return allowModeVoting; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value == allowModeVoting) return;
|
||||||
|
allowModeVoting = value;
|
||||||
|
GameMain.NetLobbyScreen.ModeList.Enabled = value || GameMain.Server != null;
|
||||||
|
GameMain.NetLobbyScreen.InfoFrame.FindChild("modevotes").Visible = value;
|
||||||
|
if (GameMain.Server != null)
|
||||||
|
{
|
||||||
|
UpdateVoteTexts(GameMain.Server.connectedClients, VoteType.Mode);
|
||||||
|
GameMain.Server.UpdateVoteStatus();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GameMain.NetLobbyScreen.ModeList.Deselect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterVote(NetIncomingMessage inc, List<Client> connectedClients)
|
||||||
|
{
|
||||||
|
byte voteTypeByte = inc.ReadByte();
|
||||||
|
VoteType voteType = VoteType.Unknown;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
voteType = (VoteType)voteTypeByte;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Client sender = connectedClients.Find(x => x.Connection == inc.SenderConnection);
|
||||||
|
switch (voteType)
|
||||||
|
{
|
||||||
|
case VoteType.Sub:
|
||||||
|
string subName = inc.ReadString();
|
||||||
|
Submarine sub = Submarine.SavedSubmarines.Find(s => s.Name == subName);
|
||||||
|
sender.SetVote(voteType, sub);
|
||||||
|
UpdateVoteTexts(connectedClients, voteType);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VoteType.Mode:
|
||||||
|
string modeName = inc.ReadString();
|
||||||
|
GameModePreset mode = GameModePreset.list.Find(gm => gm.Name == modeName);
|
||||||
|
sender.SetVote(voteType, mode);
|
||||||
|
UpdateVoteTexts(connectedClients, voteType);
|
||||||
|
break;
|
||||||
|
case VoteType.EndRound:
|
||||||
|
sender.SetVote(voteType, inc.ReadBoolean());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameMain.Server.UpdateVoteStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateVoteTexts(List<Client> clients, VoteType voteType)
|
||||||
|
{
|
||||||
|
GUIListBox listBox = (voteType == VoteType.Sub) ?
|
||||||
|
GameMain.NetLobbyScreen.SubList : GameMain.NetLobbyScreen.ModeList;
|
||||||
|
|
||||||
|
foreach (GUIComponent comp in listBox.children)
|
||||||
|
{
|
||||||
|
GUITextBlock voteText = comp.FindChild("votes") as GUITextBlock;
|
||||||
|
if (voteText != null) comp.RemoveChild(voteText);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Pair<object, int>> voteList = GetVoteList(voteType, clients);
|
||||||
|
foreach (Pair<object, int> votable in voteList)
|
||||||
|
{
|
||||||
|
SetVoteText(listBox, votable.First, votable.Second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetVoteText(GUIListBox listBox, object userData, int votes)
|
||||||
|
{
|
||||||
|
if (userData == null) return;
|
||||||
|
foreach (GUIComponent comp in listBox.children)
|
||||||
|
{
|
||||||
|
if (comp.UserData != userData) continue;
|
||||||
|
GUITextBlock voteText = comp.FindChild("votes") as GUITextBlock;
|
||||||
|
if (voteText == null)
|
||||||
|
{
|
||||||
|
voteText = new GUITextBlock(new Rectangle(0, 0, 30, 0), "", GUI.Style, Alignment.Right, Alignment.Right, comp);
|
||||||
|
voteText.UserData = "votes";
|
||||||
|
}
|
||||||
|
|
||||||
|
voteText.Text = votes.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Pair<object, int>> GetVoteList(VoteType voteType, List<Client> voters)
|
||||||
|
{
|
||||||
|
List<Pair<object, int>> voteList = new List<Pair<object, int>>();
|
||||||
|
|
||||||
|
foreach (Client voter in voters)
|
||||||
|
{
|
||||||
|
object vote = voter.GetVote(voteType);
|
||||||
|
if (vote == null) continue;
|
||||||
|
|
||||||
|
var existingVotable = voteList.Find(v => v.First == vote);
|
||||||
|
if (existingVotable == null)
|
||||||
|
{
|
||||||
|
voteList.Add(Pair<object, int>.Create(vote, 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
existingVotable.Second++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return voteList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T HighestVoted<T>(VoteType voteType, List<Client> voters)
|
||||||
|
{
|
||||||
|
if (voteType == VoteType.Sub && !AllowSubVoting) return default(T);
|
||||||
|
if (voteType == VoteType.Mode && !AllowModeVoting) return default(T);
|
||||||
|
|
||||||
|
List<Pair<object, int>> voteList = GetVoteList(voteType,voters);
|
||||||
|
|
||||||
|
T selected = default(T);
|
||||||
|
int highestVotes = 0;
|
||||||
|
foreach (Pair<object, int> votable in voteList)
|
||||||
|
{
|
||||||
|
if (selected == null || votable.Second > highestVotes)
|
||||||
|
{
|
||||||
|
highestVotes = votable.Second;
|
||||||
|
selected = (T)votable.First;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteData(NetOutgoingMessage msg, List<Client> voters)
|
||||||
|
{
|
||||||
|
msg.Write(allowSubVoting);
|
||||||
|
|
||||||
|
if (allowSubVoting)
|
||||||
|
{
|
||||||
|
List<Pair<object, int>> voteList = GetVoteList(VoteType.Sub, voters);
|
||||||
|
msg.Write((byte)voteList.Count);
|
||||||
|
foreach (Pair<object, int> vote in voteList)
|
||||||
|
{
|
||||||
|
if (vote.Second < 1 || vote.First==null) continue;
|
||||||
|
msg.Write((byte)vote.Second);
|
||||||
|
msg.Write(((Submarine)vote.First).Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
msg.Write(AllowModeVoting);
|
||||||
|
if (allowModeVoting)
|
||||||
|
{
|
||||||
|
List<Pair<object, int>> voteList = GetVoteList(VoteType.Mode, voters);
|
||||||
|
msg.Write((byte)voteList.Count);
|
||||||
|
foreach (Pair<object, int> vote in voteList)
|
||||||
|
{
|
||||||
|
if (vote.Second < 1 || vote.First == null) continue;
|
||||||
|
msg.Write((byte)vote.Second);
|
||||||
|
msg.Write(((GameModePreset)vote.First).Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReadData(NetIncomingMessage msg)
|
||||||
|
{
|
||||||
|
AllowSubVoting = msg.ReadBoolean();
|
||||||
|
if (allowSubVoting)
|
||||||
|
{
|
||||||
|
int votableCount = msg.ReadByte();
|
||||||
|
for (int i = 0; i<votableCount; i++)
|
||||||
|
{
|
||||||
|
int votes = msg.ReadByte();
|
||||||
|
string subName = msg.ReadString();
|
||||||
|
Submarine sub = Submarine.SavedSubmarines.Find(sm => sm.Name == subName);
|
||||||
|
SetVoteText(GameMain.NetLobbyScreen.SubList, sub, votes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AllowModeVoting = msg.ReadBoolean();
|
||||||
|
if (allowModeVoting)
|
||||||
|
{
|
||||||
|
int votableCount = msg.ReadByte();
|
||||||
|
for (int i = 0; i < votableCount; i++)
|
||||||
|
{
|
||||||
|
int votes = msg.ReadByte();
|
||||||
|
string modeName = msg.ReadString();
|
||||||
|
GameModePreset mode = GameModePreset.list.Find(m => m.Name == modeName);
|
||||||
|
SetVoteText(GameMain.NetLobbyScreen.SubList, mode, votes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -65,11 +65,13 @@ namespace Barotrauma
|
|||||||
if (n > 0) columnX[n] += columnX[n - 1];
|
if (n > 0) columnX[n] += columnX[n - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(middleX, 30, 0, 30), "Password", GUI.Style, menu);
|
SpriteFont font = serverList.Rect.Width < 400 ? GUI.SmallFont : GUI.Font;
|
||||||
|
|
||||||
new GUITextBlock(new Rectangle(middleX + columnX[0], 30, 0, 30), "Name", GUI.Style, menu);
|
new GUITextBlock(new Rectangle(middleX, 30, 0, 30), "Password", GUI.Style, menu).Font = font;
|
||||||
new GUITextBlock(new Rectangle(middleX + columnX[1], 30, 0, 30), "Players", GUI.Style, menu);
|
|
||||||
new GUITextBlock(new Rectangle(middleX + columnX[2], 30, 0, 30), "Round started", GUI.Style, menu);
|
new GUITextBlock(new Rectangle(middleX + columnX[0], 30, 0, 30), "Name", GUI.Style, menu).Font = font;
|
||||||
|
new GUITextBlock(new Rectangle(middleX + columnX[1], 30, 0, 30), "Players", GUI.Style, menu).Font = font;
|
||||||
|
new GUITextBlock(new Rectangle(middleX + columnX[2], 30, 0, 30), "Round started", GUI.Style, menu).Font = font;
|
||||||
|
|
||||||
joinButton = new GUIButton(new Rectangle(-170, 0, 150, 30), "Refresh", Alignment.BottomRight, GUI.Style, menu);
|
joinButton = new GUIButton(new Rectangle(-170, 0, 150, 30), "Refresh", Alignment.BottomRight, GUI.Style, menu);
|
||||||
joinButton.OnClicked = RefreshServers;
|
joinButton.OnClicked = RefreshServers;
|
||||||
|
|||||||
@@ -0,0 +1,337 @@
|
|||||||
|
using System;
|
||||||
|
using Lidgren.Network;
|
||||||
|
using Microsoft.Xna.Framework;
|
||||||
|
using Microsoft.Xna.Framework.Graphics;
|
||||||
|
using Barotrauma.Networking;
|
||||||
|
using FarseerPhysics;
|
||||||
|
using FarseerPhysics.Factories;
|
||||||
|
using FarseerPhysics.Dynamics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using RestSharp;
|
||||||
|
|
||||||
|
namespace Barotrauma
|
||||||
|
{
|
||||||
|
class ServerListScreen : Screen
|
||||||
|
{
|
||||||
|
//how often the client is allowed to refresh servers
|
||||||
|
private TimeSpan AllowedRefreshInterval = new TimeSpan(0,0,3);
|
||||||
|
|
||||||
|
private GUIFrame menu;
|
||||||
|
|
||||||
|
private GUIListBox serverList;
|
||||||
|
|
||||||
|
private GUIButton joinButton;
|
||||||
|
|
||||||
|
private GUITextBox clientNameBox, ipBox;
|
||||||
|
|
||||||
|
//private RestRequestAsyncHandle restRequestHandle;
|
||||||
|
private bool masterServerResponded;
|
||||||
|
|
||||||
|
private int[] columnX;
|
||||||
|
|
||||||
|
//a timer for
|
||||||
|
private DateTime refreshDisableTimer;
|
||||||
|
private bool waitingForRefresh;
|
||||||
|
|
||||||
|
public ServerListScreen()
|
||||||
|
{
|
||||||
|
int width = Math.Min(GameMain.GraphicsWidth - 160, 1000);
|
||||||
|
int height = Math.Min(GameMain.GraphicsHeight - 160, 700);
|
||||||
|
|
||||||
|
Rectangle panelRect = new Rectangle(0, 0, width, height);
|
||||||
|
|
||||||
|
menu = new GUIFrame(panelRect, null, Alignment.Center, GUI.Style);
|
||||||
|
menu.Padding = new Vector4(40.0f, 40.0f, 40.0f, 20.0f);
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(0, -25, 0, 30), "Join Server", GUI.Style, Alignment.CenterX, Alignment.CenterX, menu, false, GUI.LargeFont);
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(0, 30, 0, 30), "Your Name:", GUI.Style, menu);
|
||||||
|
clientNameBox = new GUITextBox(new Rectangle(0, 60, 200, 30), GUI.Style, menu);
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(0, 100, 0, 30), "Server IP:", GUI.Style, menu);
|
||||||
|
ipBox = new GUITextBox(new Rectangle(0, 130, 200, 30), GUI.Style, menu);
|
||||||
|
|
||||||
|
int middleX = (int)(width * 0.4f);
|
||||||
|
|
||||||
|
serverList = new GUIListBox(new Rectangle(middleX,60,0,height-160), GUI.Style, menu);
|
||||||
|
serverList.OnSelected = SelectServer;
|
||||||
|
|
||||||
|
float[] columnRelativeX = new float[] { 0.15f, 0.55f, 0.15f, 0.15f };
|
||||||
|
columnX = new int[columnRelativeX.Length];
|
||||||
|
for (int n = 0; n < columnX.Length; n++)
|
||||||
|
{
|
||||||
|
columnX[n] = (int)(columnRelativeX[n] * serverList.Rect.Width);
|
||||||
|
if (n > 0) columnX[n] += columnX[n - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
SpriteFont font = serverList.Rect.Width < 400 ? GUI.SmallFont : GUI.Font;
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(middleX, 30, 0, 30), "Password", GUI.Style, menu).Font = font;
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(middleX + columnX[0], 30, 0, 30), "Name", GUI.Style, menu).Font = font;
|
||||||
|
new GUITextBlock(new Rectangle(middleX + columnX[1], 30, 0, 30), "Players", GUI.Style, menu).Font = font;
|
||||||
|
new GUITextBlock(new Rectangle(middleX + columnX[2], 30, 0, 30), "Round started", GUI.Style, menu).Font = font;
|
||||||
|
|
||||||
|
joinButton = new GUIButton(new Rectangle(-170, 0, 150, 30), "Refresh", Alignment.BottomRight, GUI.Style, menu);
|
||||||
|
joinButton.OnClicked = RefreshServers;
|
||||||
|
|
||||||
|
joinButton = new GUIButton(new Rectangle(0,0,150,30), "Join", Alignment.BottomRight, GUI.Style, menu);
|
||||||
|
joinButton.OnClicked = JoinServer;
|
||||||
|
|
||||||
|
GUIButton button = new GUIButton(new Rectangle(-20, -20, 100, 30), "Back", Alignment.TopLeft, GUI.Style, menu);
|
||||||
|
button.OnClicked = GameMain.MainMenuScreen.SelectTab;
|
||||||
|
button.CanBeSelected = false;
|
||||||
|
button.SelectedColor = button.Color;
|
||||||
|
|
||||||
|
refreshDisableTimer = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Select()
|
||||||
|
{
|
||||||
|
base.Select();
|
||||||
|
|
||||||
|
|
||||||
|
RefreshServers(null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool SelectServer(GUIComponent component, object obj)
|
||||||
|
{
|
||||||
|
string ip = obj as string;
|
||||||
|
if (string.IsNullOrWhiteSpace(ip)) return false;
|
||||||
|
|
||||||
|
ipBox.Text = ip;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool RefreshServers(GUIButton button, object obj)
|
||||||
|
{
|
||||||
|
if (waitingForRefresh) return false;
|
||||||
|
serverList.ClearChildren();
|
||||||
|
|
||||||
|
new GUITextBlock(new Rectangle(0, 0, 0, 20), "Refreshing server list...", GUI.Style, serverList);
|
||||||
|
|
||||||
|
CoroutineManager.StartCoroutine(WaitForRefresh());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<object> WaitForRefresh()
|
||||||
|
{
|
||||||
|
waitingForRefresh = true;
|
||||||
|
if (refreshDisableTimer > DateTime.Now)
|
||||||
|
{
|
||||||
|
yield return new WaitForSeconds((float)(refreshDisableTimer - DateTime.Now).TotalSeconds);
|
||||||
|
}
|
||||||
|
|
||||||
|
//CoroutineManager.StartCoroutine(UpdateServerList());
|
||||||
|
CoroutineManager.StartCoroutine(SendMasterServerRequest());
|
||||||
|
|
||||||
|
waitingForRefresh = false;
|
||||||
|
|
||||||
|
refreshDisableTimer = DateTime.Now + AllowedRefreshInterval;
|
||||||
|
|
||||||
|
yield return CoroutineStatus.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateServerList(string masterServerData)
|
||||||
|
{
|
||||||
|
serverList.ClearChildren();
|
||||||
|
|
||||||
|
//string masterServerData = GetMasterServerData();
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(masterServerData))
|
||||||
|
{
|
||||||
|
var nameText = new GUITextBlock(new Rectangle(0, 0, 0, 20), "Couldn't find any servers", GUI.Style, serverList);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (masterServerData.Substring(0,5).ToLower()=="error")
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error while connecting to master server ("+masterServerData+")!");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] lines = masterServerData.Split('\n');
|
||||||
|
|
||||||
|
for (int i = 0; i<lines.Length; i++)
|
||||||
|
{
|
||||||
|
string[] arguments = lines[i].Split('|');
|
||||||
|
if (arguments.Length < 3) continue;
|
||||||
|
|
||||||
|
string IP = arguments[0];
|
||||||
|
string port = arguments[1];
|
||||||
|
string serverName = arguments[2];
|
||||||
|
string gameStarted = (arguments.Length > 3) ? arguments[3] : "";
|
||||||
|
string playerCountStr = (arguments.Length > 4) ? arguments[4] : "";
|
||||||
|
|
||||||
|
string hasPassWordStr = (arguments.Length > 5) ? arguments[5] : "";
|
||||||
|
|
||||||
|
var serverFrame = new GUIFrame(new Rectangle(0,0,0,20), (i%2 == 0) ? Color.Transparent : Color.White*0.2f, null, serverList);
|
||||||
|
serverFrame.UserData = IP+":"+port;
|
||||||
|
serverFrame.HoverColor = Color.Gold * 0.2f;
|
||||||
|
serverFrame.SelectedColor = Color.Gold * 0.5f;
|
||||||
|
|
||||||
|
var passwordBox = new GUITickBox(new Rectangle(columnX[0]/2, 0, 20, 20), "", Alignment.TopLeft, serverFrame);
|
||||||
|
passwordBox.Selected = hasPassWordStr == "1";
|
||||||
|
passwordBox.Enabled = false;
|
||||||
|
passwordBox.UserData = "password";
|
||||||
|
|
||||||
|
var nameText = new GUITextBlock(new Rectangle(columnX[0], 0, 0, 0), serverName, GUI.Style, serverFrame);
|
||||||
|
|
||||||
|
int playerCount, maxPlayers;
|
||||||
|
playerCount = GameClient.ByteToPlayerCount((byte)int.Parse(playerCountStr), out maxPlayers);
|
||||||
|
|
||||||
|
var playerCountText = new GUITextBlock(new Rectangle(columnX[1], 0, 0, 0), playerCount + "/" + maxPlayers, GUI.Style, serverFrame);
|
||||||
|
|
||||||
|
var gameStartedBox = new GUITickBox(new Rectangle(columnX[2] + (columnX[3] - columnX[2])/ 2, 0, 20, 20), "", Alignment.TopLeft, serverFrame);
|
||||||
|
gameStartedBox.Selected = gameStarted == "1";
|
||||||
|
gameStartedBox.Enabled = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<object> SendMasterServerRequest()
|
||||||
|
{
|
||||||
|
RestClient client = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
client = new RestClient(NetConfig.MasterServerUrl);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
DebugConsole.ThrowError("Error while connecting to master server", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (client == null) yield return CoroutineStatus.Success;
|
||||||
|
|
||||||
|
|
||||||
|
var request = new RestRequest("masterserver.php", Method.GET);
|
||||||
|
request.AddParameter("gamename", "barotrauma"); // adds to POST or URL querystring based on Method
|
||||||
|
request.AddParameter("action", "listservers"); // adds to POST or URL querystring based on Method
|
||||||
|
|
||||||
|
|
||||||
|
// easily add HTTP Headers
|
||||||
|
//request.AddHeader("header", "value");
|
||||||
|
|
||||||
|
//// add files to upload (works with compatible verbs)
|
||||||
|
//request.AddFile(path);
|
||||||
|
|
||||||
|
// execute the request
|
||||||
|
masterServerResponded = false;
|
||||||
|
var restRequestHandle = client.ExecuteAsync(request, response => MasterServerCallBack(response));
|
||||||
|
|
||||||
|
DateTime timeOut = DateTime.Now + new TimeSpan(0, 0, 8);
|
||||||
|
while (!masterServerResponded)
|
||||||
|
{
|
||||||
|
if (DateTime.Now > timeOut)
|
||||||
|
{
|
||||||
|
serverList.ClearChildren();
|
||||||
|
restRequestHandle.Abort();
|
||||||
|
DebugConsole.ThrowError("Couldn't connect to master server (request timed out)");
|
||||||
|
}
|
||||||
|
yield return CoroutineStatus.Running;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return CoroutineStatus.Success;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MasterServerCallBack(IRestResponse response)
|
||||||
|
{
|
||||||
|
masterServerResponded = true;
|
||||||
|
|
||||||
|
if (response.ErrorException!=null)
|
||||||
|
{
|
||||||
|
serverList.ClearChildren();
|
||||||
|
DebugConsole.ThrowError("Error while connecting to master server", response.ErrorException);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (response.StatusCode!= System.Net.HttpStatusCode.OK)
|
||||||
|
{
|
||||||
|
serverList.ClearChildren();
|
||||||
|
DebugConsole.ThrowError("Error while connecting to master server (" +response.StatusCode+": "+response.StatusDescription+")");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateServerList(response.Content);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool JoinServer(GUIButton button, object obj)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(clientNameBox.Text))
|
||||||
|
{
|
||||||
|
clientNameBox.Flash();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
string ip = ipBox.Text;
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(ip))
|
||||||
|
{
|
||||||
|
ipBox.Flash();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CoroutineManager.StartCoroutine(JoinServer(ip));
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<object> JoinServer(string ip)
|
||||||
|
{
|
||||||
|
string selectedPassword = "";
|
||||||
|
|
||||||
|
if (serverList.Selected!=null && (serverList.Selected.GetChild("password") as GUITickBox).Selected)
|
||||||
|
{
|
||||||
|
var msgBox = new GUIMessageBox("Password required:", "");
|
||||||
|
var passwordBox = new GUITextBox(new Rectangle(0,40,150,25), Alignment.TopLeft, GUI.Style, msgBox);
|
||||||
|
passwordBox.UserData = "password";
|
||||||
|
|
||||||
|
var okButton = msgBox.GetChild<GUIButton>();
|
||||||
|
|
||||||
|
while (GUIMessageBox.MessageBoxes.Contains(msgBox))
|
||||||
|
{
|
||||||
|
okButton.Enabled = !string.IsNullOrWhiteSpace(passwordBox.Text);
|
||||||
|
yield return CoroutineStatus.Running;
|
||||||
|
}
|
||||||
|
|
||||||
|
selectedPassword = passwordBox.Text;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameMain.NetworkMember = new GameClient(clientNameBox.Text);
|
||||||
|
GameMain.Client.ConnectToServer(ip, selectedPassword);
|
||||||
|
|
||||||
|
yield return CoroutineStatus.Success;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Draw(double deltaTime, GraphicsDevice graphics, SpriteBatch spriteBatch)
|
||||||
|
{
|
||||||
|
graphics.Clear(Color.CornflowerBlue);
|
||||||
|
|
||||||
|
GameMain.GameScreen.DrawMap(graphics, spriteBatch);
|
||||||
|
|
||||||
|
spriteBatch.Begin();
|
||||||
|
|
||||||
|
menu.Draw(spriteBatch);
|
||||||
|
|
||||||
|
//if (previewPlayer!=null) previewPlayer.Draw(spriteBatch);
|
||||||
|
|
||||||
|
GUI.Draw((float)deltaTime, spriteBatch, null);
|
||||||
|
|
||||||
|
spriteBatch.End();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Update(double deltaTime)
|
||||||
|
{
|
||||||
|
menu.Update((float)deltaTime);
|
||||||
|
|
||||||
|
GUI.Update((float)deltaTime);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -14,7 +14,7 @@ namespace Barotrauma
|
|||||||
None,
|
None,
|
||||||
StructureBlunt, StructureSlash,
|
StructureBlunt, StructureSlash,
|
||||||
LimbBlunt, LimbSlash, LimbArmor,
|
LimbBlunt, LimbSlash, LimbArmor,
|
||||||
Implode }
|
Implode, Pressure }
|
||||||
|
|
||||||
public struct DamageSound
|
public struct DamageSound
|
||||||
{
|
{
|
||||||
@@ -228,7 +228,11 @@ namespace Barotrauma
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<BackgroundMusic> suitableMusic = null;
|
List<BackgroundMusic> suitableMusic = null;
|
||||||
if (criticalTask == null)
|
if (Submarine.Loaded!=null && Submarine.Loaded.Position.Y<0.0f)
|
||||||
|
{
|
||||||
|
suitableMusic = musicClips.Where(x => x != null && x.type == "deep").ToList();
|
||||||
|
}
|
||||||
|
else if (criticalTask == null)
|
||||||
{
|
{
|
||||||
suitableMusic = musicClips.Where(x => x != null && x.type == "default").ToList();
|
suitableMusic = musicClips.Where(x => x != null && x.type == "default").ToList();
|
||||||
}
|
}
|
||||||
@@ -278,7 +282,7 @@ namespace Barotrauma
|
|||||||
PlayDamageSound(damageType, damage, bodyPosition);
|
PlayDamageSound(damageType, damage, bodyPosition);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void PlayDamageSound(DamageSoundType damageType, float damage, Vector2 position)
|
public static void PlayDamageSound(DamageSoundType damageType, float damage, Vector2 position, float range = 2000.0f)
|
||||||
{
|
{
|
||||||
damage = MathHelper.Clamp(damage+Rand.Range(-10.0f, 10.0f), 0.0f, 100.0f);
|
damage = MathHelper.Clamp(damage+Rand.Range(-10.0f, 10.0f), 0.0f, 100.0f);
|
||||||
var sounds = damageSounds.Where(x => damage >= x.damageRange.X && damage <= x.damageRange.Y && x.damageType == damageType).ToList();
|
var sounds = damageSounds.Where(x => damage >= x.damageRange.X && damage <= x.damageRange.Y && x.damageType == damageType).ToList();
|
||||||
@@ -291,7 +295,7 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
if (i == selectedSound)
|
if (i == selectedSound)
|
||||||
{
|
{
|
||||||
s.sound.Play(1.0f, 2000.0f, position);
|
s.sound.Play(1.0f, range, position);
|
||||||
Debug.WriteLine("playing: " + s.sound);
|
Debug.WriteLine("playing: " + s.sound);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,21 @@ using System.Xml.Linq;
|
|||||||
|
|
||||||
namespace Barotrauma
|
namespace Barotrauma
|
||||||
{
|
{
|
||||||
|
public class Pair<T1, T2>
|
||||||
|
{
|
||||||
|
public T1 First { get; set; }
|
||||||
|
public T2 Second { get; set; }
|
||||||
|
|
||||||
|
public static Pair<T1, T2> Create(T1 first, T2 second)
|
||||||
|
{
|
||||||
|
Pair<T1, T2> pair = new Pair<T1, T2>();
|
||||||
|
pair.First = first;
|
||||||
|
pair.Second = second;
|
||||||
|
|
||||||
|
return pair;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static class ToolBox
|
public static class ToolBox
|
||||||
{
|
{
|
||||||
public static XDocument TryLoadXml(string filePath)
|
public static XDocument TryLoadXml(string filePath)
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user