(61d00a474) v0.9.7.1
This commit is contained in:
@@ -0,0 +1,315 @@
|
||||
//#define RUN_PHYSICS_IN_SEPARATE_THREAD
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
using System.Threading;
|
||||
using FarseerPhysics.Dynamics;
|
||||
#if DEBUG && CLIENT
|
||||
using Microsoft.Xna.Framework.Input;
|
||||
#endif
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
partial class GameScreen : Screen
|
||||
{
|
||||
private object updateLock = new object();
|
||||
private double physicsTime;
|
||||
|
||||
#if CLIENT
|
||||
private readonly Camera cam;
|
||||
|
||||
public override Camera Cam
|
||||
{
|
||||
get { return cam; }
|
||||
}
|
||||
#elif SERVER
|
||||
public override Camera Cam
|
||||
{
|
||||
get { return Camera.Instance; }
|
||||
}
|
||||
#endif
|
||||
|
||||
public double GameTime
|
||||
{
|
||||
get;
|
||||
private set;
|
||||
}
|
||||
|
||||
public GameScreen()
|
||||
{
|
||||
Camera cam;
|
||||
#if CLIENT
|
||||
cam = new Camera();
|
||||
cam.Translate(new Vector2(-10.0f, 50.0f));
|
||||
#endif
|
||||
}
|
||||
|
||||
public override void Select()
|
||||
{
|
||||
base.Select();
|
||||
|
||||
#if CLIENT
|
||||
if (Character.Controlled != null)
|
||||
{
|
||||
cam.Position = Character.Controlled.WorldPosition;
|
||||
cam.UpdateTransform(true);
|
||||
}
|
||||
else if (Submarine.MainSub != null)
|
||||
{
|
||||
cam.Position = Submarine.MainSub.WorldPosition;
|
||||
cam.UpdateTransform(true);
|
||||
}
|
||||
#endif
|
||||
|
||||
foreach (MapEntity entity in MapEntity.mapEntityList)
|
||||
entity.IsHighlighted = false;
|
||||
|
||||
#if RUN_PHYSICS_IN_SEPARATE_THREAD
|
||||
var physicsThread = new Thread(ExecutePhysics)
|
||||
{
|
||||
Name = "Physics thread",
|
||||
IsBackground = true
|
||||
};
|
||||
physicsThread.Start();
|
||||
#endif
|
||||
}
|
||||
|
||||
public override void Deselect()
|
||||
{
|
||||
base.Deselect();
|
||||
|
||||
#if CLIENT
|
||||
GameMain.Config.SaveNewPlayerConfig();
|
||||
GameMain.SoundManager.SetCategoryMuffle("default", false);
|
||||
GUI.ClearMessages();
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Allows the game to run logic such as updating the world,
|
||||
/// checking for collisions, gathering input, and playing audio.
|
||||
/// </summary>
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
#if RUN_PHYSICS_IN_SEPARATE_THREAD
|
||||
physicsTime += deltaTime;
|
||||
lock (updateLock)
|
||||
{
|
||||
#endif
|
||||
|
||||
|
||||
#if DEBUG && CLIENT
|
||||
if (GameMain.GameSession != null && GameMain.GameSession.Level != null && GameMain.GameSession.Submarine != null &&
|
||||
!DebugConsole.IsOpen && GUI.KeyboardDispatcher.Subscriber == null)
|
||||
{
|
||||
var closestSub = Submarine.FindClosest(cam.WorldViewCenter);
|
||||
if (closestSub == null) closestSub = GameMain.GameSession.Submarine;
|
||||
|
||||
Vector2 targetMovement = Vector2.Zero;
|
||||
if (PlayerInput.KeyDown(Keys.I)) targetMovement.Y += 1.0f;
|
||||
if (PlayerInput.KeyDown(Keys.K)) targetMovement.Y -= 1.0f;
|
||||
if (PlayerInput.KeyDown(Keys.J)) targetMovement.X -= 1.0f;
|
||||
if (PlayerInput.KeyDown(Keys.L)) targetMovement.X += 1.0f;
|
||||
|
||||
if (targetMovement != Vector2.Zero)
|
||||
closestSub.ApplyForce(targetMovement * closestSub.SubBody.Body.Mass * 100.0f);
|
||||
}
|
||||
#endif
|
||||
|
||||
GameTime += deltaTime;
|
||||
|
||||
foreach (PhysicsBody body in PhysicsBody.List)
|
||||
{
|
||||
if (body.Enabled) { body.Update(); }
|
||||
}
|
||||
foreach (MapEntity e in MapEntity.mapEntityList)
|
||||
{
|
||||
e.IsHighlighted = false;
|
||||
}
|
||||
|
||||
if (GameMain.GameSession != null) GameMain.GameSession.Update((float)deltaTime);
|
||||
#if CLIENT
|
||||
var sw = new System.Diagnostics.Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
GameMain.ParticleManager.Update((float)deltaTime);
|
||||
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("ParticleUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
|
||||
GameMain.LightManager.Update((float)deltaTime);
|
||||
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("LightUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
|
||||
if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, cam);
|
||||
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("LevelUpdate", sw.ElapsedTicks);
|
||||
|
||||
if (Character.Controlled != null)
|
||||
{
|
||||
if (Character.Controlled.SelectedConstruction != null && Character.Controlled.CanInteractWith(Character.Controlled.SelectedConstruction))
|
||||
{
|
||||
Character.Controlled.SelectedConstruction.UpdateHUD(cam, Character.Controlled, (float)deltaTime);
|
||||
}
|
||||
if (Character.Controlled.Inventory != null)
|
||||
{
|
||||
foreach (Item item in Character.Controlled.Inventory.Items)
|
||||
{
|
||||
if (item == null) { continue; }
|
||||
if (Character.Controlled.HasEquippedItem(item))
|
||||
{
|
||||
item.UpdateHUD(cam, Character.Controlled, (float)deltaTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sw.Restart();
|
||||
|
||||
Character.UpdateAll((float)deltaTime, cam);
|
||||
#elif SERVER
|
||||
if (Level.Loaded != null) Level.Loaded.Update((float)deltaTime, Camera.Instance);
|
||||
Character.UpdateAll((float)deltaTime, Camera.Instance);
|
||||
#endif
|
||||
|
||||
|
||||
#if CLIENT
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("CharacterUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
#endif
|
||||
|
||||
StatusEffect.UpdateAll((float)deltaTime);
|
||||
|
||||
#if CLIENT
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("StatusEffectUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
|
||||
if (Character.Controlled != null &&
|
||||
Lights.LightManager.ViewTarget != null)
|
||||
{
|
||||
Vector2 targetPos = Lights.LightManager.ViewTarget.DrawPosition;
|
||||
if (Lights.LightManager.ViewTarget == Character.Controlled &&
|
||||
(CharacterHealth.OpenHealthWindow != null || CrewManager.IsCommandInterfaceOpen))
|
||||
{
|
||||
Vector2 screenTargetPos = new Vector2(0.0f, GameMain.GraphicsHeight * 0.5f);
|
||||
if (CrewManager.IsCommandInterfaceOpen)
|
||||
{
|
||||
screenTargetPos.X = GameMain.GraphicsWidth * 0.5f;
|
||||
}
|
||||
else
|
||||
{
|
||||
screenTargetPos = CharacterHealth.OpenHealthWindow.Alignment == Alignment.Left ?
|
||||
new Vector2(GameMain.GraphicsWidth * 0.75f, GameMain.GraphicsHeight * 0.5f) :
|
||||
new Vector2(GameMain.GraphicsWidth * 0.25f, GameMain.GraphicsHeight * 0.5f);
|
||||
}
|
||||
Vector2 screenOffset = screenTargetPos - new Vector2(GameMain.GraphicsWidth / 2, GameMain.GraphicsHeight / 2);
|
||||
screenOffset.Y = -screenOffset.Y;
|
||||
targetPos -= screenOffset / cam.Zoom;
|
||||
}
|
||||
cam.TargetPos = targetPos;
|
||||
}
|
||||
|
||||
cam.MoveCamera((float)deltaTime);
|
||||
#endif
|
||||
|
||||
foreach (Submarine sub in Submarine.Loaded)
|
||||
{
|
||||
sub.SetPrevTransform(sub.Position);
|
||||
}
|
||||
|
||||
foreach (PhysicsBody body in PhysicsBody.List)
|
||||
{
|
||||
if (body.Enabled) { body.SetPrevTransform(body.SimPosition, body.Rotation); }
|
||||
}
|
||||
|
||||
#if CLIENT
|
||||
MapEntity.UpdateAll((float)deltaTime, cam);
|
||||
#elif SERVER
|
||||
MapEntity.UpdateAll((float)deltaTime, Camera.Instance);
|
||||
#endif
|
||||
|
||||
#if CLIENT
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("MapEntityUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
#endif
|
||||
Character.UpdateAnimAll((float)deltaTime);
|
||||
|
||||
#if CLIENT
|
||||
Ragdoll.UpdateAll((float)deltaTime, cam);
|
||||
#elif SERVER
|
||||
Ragdoll.UpdateAll((float)deltaTime, Camera.Instance);
|
||||
#endif
|
||||
|
||||
#if CLIENT
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("AnimUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
#endif
|
||||
|
||||
foreach (Submarine sub in Submarine.Loaded)
|
||||
{
|
||||
sub.Update((float)deltaTime);
|
||||
}
|
||||
|
||||
#if CLIENT
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("SubmarineUpdate", sw.ElapsedTicks);
|
||||
sw.Restart();
|
||||
#endif
|
||||
|
||||
#if !RUN_PHYSICS_IN_SEPARATE_THREAD
|
||||
try
|
||||
{
|
||||
GameMain.World.Step((float)Timing.Step);
|
||||
}
|
||||
catch (WorldLockedException e)
|
||||
{
|
||||
string errorMsg = "Attempted to modify the state of the physics simulation while a time step was running.";
|
||||
DebugConsole.ThrowError(errorMsg, e);
|
||||
GameAnalyticsManager.AddErrorEventOnce("GameScreen.Update:WorldLockedException" + e.Message, GameAnalyticsSDK.Net.EGAErrorSeverity.Critical, errorMsg);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if CLIENT
|
||||
sw.Stop();
|
||||
GameMain.PerformanceCounter.AddElapsedTicks("Physics", sw.ElapsedTicks);
|
||||
#endif
|
||||
|
||||
#if CLIENT
|
||||
if (!PlayerInput.PrimaryMouseButtonHeld())
|
||||
{
|
||||
Inventory.draggingSlot = null;
|
||||
Inventory.draggingItem = null;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if RUN_PHYSICS_IN_SEPARATE_THREAD
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private void ExecutePhysics()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
while (physicsTime >= Timing.Step)
|
||||
{
|
||||
lock (updateLock)
|
||||
{
|
||||
GameMain.World.Step((float)Timing.Step);
|
||||
physicsTime -= Timing.Step;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
using Barotrauma.Networking;
|
||||
using Microsoft.Xna.Framework;
|
||||
using System;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
partial class NetLobbyScreen : Screen
|
||||
{
|
||||
private UInt16 lastUpdateID;
|
||||
public UInt16 LastUpdateID
|
||||
{
|
||||
get
|
||||
{
|
||||
#if SERVER
|
||||
if (GameMain.Server != null && lastUpdateID < 1) lastUpdateID++;
|
||||
#endif
|
||||
return lastUpdateID;
|
||||
}
|
||||
set { lastUpdateID = value; }
|
||||
}
|
||||
|
||||
private string levelSeed = "";
|
||||
|
||||
public void SetLevelDifficulty(float difficulty)
|
||||
{
|
||||
difficulty = MathHelper.Clamp(difficulty, 0.0f, 100.0f);
|
||||
#if SERVER
|
||||
if (GameMain.Server != null)
|
||||
{
|
||||
GameMain.Server.ServerSettings.SelectedLevelDifficulty = difficulty;
|
||||
lastUpdateID++;
|
||||
}
|
||||
#endif
|
||||
#if CLIENT
|
||||
levelDifficultyScrollBar.BarScroll = difficulty / 100.0f;
|
||||
levelDifficultyScrollBar.OnMoved(levelDifficultyScrollBar, levelDifficultyScrollBar.BarScroll);
|
||||
#endif
|
||||
}
|
||||
|
||||
public void ToggleTraitorsEnabled(int dir)
|
||||
{
|
||||
#if SERVER
|
||||
if (GameMain.Server == null) return;
|
||||
|
||||
lastUpdateID++;
|
||||
|
||||
int index = (int)GameMain.Server.ServerSettings.TraitorsEnabled + dir;
|
||||
if (index < 0) index = 2;
|
||||
if (index > 2) index = 0;
|
||||
|
||||
SetTraitorsEnabled((YesNoMaybe)index);
|
||||
#endif
|
||||
}
|
||||
|
||||
public void SetBotCount(int botCount)
|
||||
{
|
||||
#if SERVER
|
||||
if (GameMain.Server != null)
|
||||
{
|
||||
if (botCount < 0) botCount = GameMain.Server.ServerSettings.MaxBotCount;
|
||||
if (botCount > GameMain.Server.ServerSettings.MaxBotCount) botCount = 0;
|
||||
|
||||
GameMain.Server.ServerSettings.BotCount = botCount;
|
||||
lastUpdateID++;
|
||||
}
|
||||
#endif
|
||||
#if CLIENT
|
||||
(botCountText as GUITextBlock).Text = botCount.ToString();
|
||||
#endif
|
||||
}
|
||||
|
||||
public void SetBotSpawnMode(BotSpawnMode botSpawnMode)
|
||||
{
|
||||
#if SERVER
|
||||
if (GameMain.Server != null)
|
||||
{
|
||||
GameMain.Server.ServerSettings.BotSpawnMode = botSpawnMode;
|
||||
lastUpdateID++;
|
||||
}
|
||||
#endif
|
||||
#if CLIENT
|
||||
(botSpawnModeText as GUITextBlock).Text = TextManager.Get(botSpawnMode.ToString());
|
||||
#endif
|
||||
}
|
||||
|
||||
public void SetTraitorsEnabled(YesNoMaybe enabled)
|
||||
{
|
||||
#if SERVER
|
||||
if (GameMain.Server != null) GameMain.Server.ServerSettings.TraitorsEnabled = enabled;
|
||||
#endif
|
||||
#if CLIENT
|
||||
(traitorProbabilityText as GUITextBlock).Text = TextManager.Get(enabled.ToString());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
namespace Barotrauma
|
||||
{
|
||||
partial class Screen
|
||||
{
|
||||
private static Screen selected;
|
||||
|
||||
public static Screen Selected
|
||||
{
|
||||
get { return selected; }
|
||||
}
|
||||
|
||||
public static void SelectNull()
|
||||
{
|
||||
selected = null;
|
||||
}
|
||||
|
||||
public virtual void Deselect()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void Select()
|
||||
{
|
||||
|
||||
if (selected != null && selected != this)
|
||||
{
|
||||
selected.Deselect();
|
||||
#if CLIENT
|
||||
GUI.ClearCursorWait();
|
||||
//make sure any textbox in the previously selected screen doesn't stay selected
|
||||
if (GUI.KeyboardDispatcher.Subscriber != DebugConsole.TextBox)
|
||||
{
|
||||
GUI.KeyboardDispatcher.Subscriber = null;
|
||||
GUI.ScreenChanged = true;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
selected = this;
|
||||
}
|
||||
|
||||
public virtual Camera Cam
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
public virtual void Update(double deltaTime)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user