(f6c34b377) Fix crawlers not reacting to any targets if properly latched on walls.

This commit is contained in:
Joonas Rikkonen
2019-04-11 18:26:42 +03:00
parent 9b0e0ab278
commit a57b7184fb
9 changed files with 41 additions and 41 deletions
@@ -33,7 +33,7 @@ namespace Barotrauma
set set
{ {
if (_toggleOpen == value) { return; } if (_toggleOpen == value) { return; }
_toggleOpen = GameMain.Config.ChatOpen = value; _toggleOpen = value;
foreach (GUIComponent child in ToggleButton.Children) foreach (GUIComponent child in ToggleButton.Children)
{ {
child.SpriteEffects = _toggleOpen == (HUDLayoutSettings.ChatBoxAlignment == Alignment.Right) ? child.SpriteEffects = _toggleOpen == (HUDLayoutSettings.ChatBoxAlignment == Alignment.Right) ?
@@ -133,8 +133,6 @@ namespace Barotrauma
} }
return true; return true;
}; };
ToggleOpen = GameMain.Config.ChatOpen;
} }
public bool TypingChatMessage(GUITextBox textBox, string text) public bool TypingChatMessage(GUITextBox textBox, string text)
@@ -324,6 +322,8 @@ namespace Barotrauma
prevUIScale = GUI.Scale; prevUIScale = GUI.Scale;
} }
if (ToggleOpen || (inputBox != null && inputBox.Selected)) if (ToggleOpen || (inputBox != null && inputBox.Selected))
{ {
openState += deltaTime * 5.0f; openState += deltaTime * 5.0f;
@@ -56,7 +56,7 @@ namespace Barotrauma
set set
{ {
if (toggleCrewAreaOpen == value) { return; } if (toggleCrewAreaOpen == value) { return; }
toggleCrewAreaOpen = GameMain.Config.CrewMenuOpen = value; toggleCrewAreaOpen = value;
foreach (GUIComponent child in toggleCrewButton.Children) foreach (GUIComponent child in toggleCrewButton.Children)
{ {
child.SpriteEffects = toggleCrewAreaOpen ? SpriteEffects.None : SpriteEffects.FlipHorizontally; child.SpriteEffects = toggleCrewAreaOpen ? SpriteEffects.None : SpriteEffects.FlipHorizontally;
@@ -215,8 +215,6 @@ namespace Barotrauma
screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight); screenResolution = new Point(GameMain.GraphicsWidth, GameMain.GraphicsHeight);
prevUIScale = GUI.Scale; prevUIScale = GUI.Scale;
ToggleCrewAreaOpen = GameMain.Config.CrewMenuOpen;
} }
@@ -1114,9 +1114,7 @@ namespace Barotrauma.Networking
if (campaign == null) if (campaign == null)
{ {
GameMain.GameSession = missionIndex < 0 ? GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode, missionIndex < 0 ? null : MissionPrefab.List[missionIndex]);
new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode, MissionType.None) :
new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode, MissionPrefab.List[missionIndex]);
GameMain.GameSession.StartRound(levelSeed, levelDifficulty, loadSecondSub); GameMain.GameSession.StartRound(levelSeed, levelDifficulty, loadSecondSub);
} }
else else
@@ -1754,10 +1754,11 @@ namespace Barotrauma.Networking
Log("Game mode: " + selectedMode.Name, ServerLog.MessageType.ServerMessage); Log("Game mode: " + selectedMode.Name, ServerLog.MessageType.ServerMessage);
Log("Submarine: " + selectedSub.Name, ServerLog.MessageType.ServerMessage); Log("Submarine: " + selectedSub.Name, ServerLog.MessageType.ServerMessage);
Log("Level seed: " + GameMain.NetLobbyScreen.LevelSeed, ServerLog.MessageType.ServerMessage); Log("Level seed: " + GameMain.NetLobbyScreen.LevelSeed, ServerLog.MessageType.ServerMessage);
} }
MissionMode missionMode = GameMain.GameSession.GameMode as MissionMode; bool missionAllowRespawn = campaign == null &&
bool missionAllowRespawn = campaign == null && (missionMode?.Mission == null || missionMode.Mission.AllowRespawn); (!(GameMain.GameSession.GameMode is MissionMode) ||
((MissionMode)GameMain.GameSession.GameMode).Mission.AllowRespawn);
if (serverSettings.AllowRespawn && missionAllowRespawn) respawnManager = new RespawnManager(this, usingShuttle ? selectedShuttle : null); if (serverSettings.AllowRespawn && missionAllowRespawn) respawnManager = new RespawnManager(this, usingShuttle ? selectedShuttle : null);
@@ -1940,8 +1941,10 @@ namespace Barotrauma.Networking
MultiPlayerCampaign campaign = GameMain.GameSession?.GameMode as MultiPlayerCampaign; MultiPlayerCampaign campaign = GameMain.GameSession?.GameMode as MultiPlayerCampaign;
MissionMode missionMode = GameMain.GameSession.GameMode as MissionMode; bool missionAllowRespawn = campaign == null &&
bool missionAllowRespawn = campaign == null && (missionMode?.Mission == null || missionMode.Mission.AllowRespawn); (!(GameMain.GameSession.GameMode is MissionMode) ||
((MissionMode)GameMain.GameSession.GameMode).Mission.AllowRespawn);
msg.Write(serverSettings.AllowRespawn && missionAllowRespawn); msg.Write(serverSettings.AllowRespawn && missionAllowRespawn);
msg.Write(Submarine.MainSubs[1] != null); //loadSecondSub msg.Write(Submarine.MainSubs[1] != null); //loadSecondSub
@@ -487,7 +487,7 @@ namespace Barotrauma
} }
else else
{ {
if (!IsProperlyLatched) if (!IsProperlyLatchedOnSub)
{ {
UpdateWallTarget(); UpdateWallTarget();
} }
@@ -1003,11 +1003,12 @@ namespace Barotrauma
private void UpdateEating(float deltaTime) private void UpdateEating(float deltaTime)
{ {
if (SelectedAiTarget == null) if (SelectedAiTarget == null) //SelectedAiTarget.Entity is Character c && !c.IsDead
{ {
State = AIState.Idle; State = AIState.Idle;
return; return;
} }
Character targetChar = SelectedAiTarget.Entity as Character;
Limb mouthLimb = Array.Find(Character.AnimController.Limbs, l => l != null && l.MouthPos.HasValue); Limb mouthLimb = Array.Find(Character.AnimController.Limbs, l => l != null && l.MouthPos.HasValue);
if (mouthLimb == null) mouthLimb = Character.AnimController.GetLimb(LimbType.Head); if (mouthLimb == null) mouthLimb = Character.AnimController.GetLimb(LimbType.Head);
@@ -1039,14 +1040,14 @@ namespace Barotrauma
#region Targeting #region Targeting
private bool IsProperlyLatched => LatchOntoAI != null && LatchOntoAI.IsAttached && SelectedAiTarget?.Entity == wallTarget?.Structure; private bool IsProperlyLatchedOnSub => LatchOntoAI != null && LatchOntoAI.IsAttachedToSub && SelectedAiTarget?.Entity == wallTarget?.Structure;
//goes through all the AItargets, evaluates how preferable it is to attack the target, //goes through all the AItargets, evaluates how preferable it is to attack the target,
//whether the Character can see/hear the target and chooses the most preferable target within //whether the Character can see/hear the target and chooses the most preferable target within
//sight/hearing range //sight/hearing range
public AITarget UpdateTargets(Character character, out TargetingPriority priority) public AITarget UpdateTargets(Character character, out TargetingPriority priority)
{ {
if (IsProperlyLatched) if (IsProperlyLatchedOnSub)
{ {
// If attached to a valid target, just keep the target. // If attached to a valid target, just keep the target.
// Priority not used in this case. // Priority not used in this case.
@@ -54,6 +54,8 @@ namespace Barotrauma
get { return attachJoints.Count > 0; } get { return attachJoints.Count > 0; }
} }
public bool IsAttachedToSub => IsAttached && attachTargetBody?.UserData is Entity entity && (entity is Submarine sub || entity?.Submarine != null);
public LatchOntoAI(XElement element, EnemyAIController enemyAI) public LatchOntoAI(XElement element, EnemyAIController enemyAI)
{ {
attachToWalls = element.GetAttributeBool("attachtowalls", false); attachToWalls = element.GetAttributeBool("attachtowalls", false);
@@ -207,10 +209,10 @@ namespace Barotrauma
break; break;
} }
if (attachTargetBody != null && deattachTimer < 0.0f) if (IsAttached && attachTargetBody != null && deattachTimer < 0.0f)
{ {
Entity entity = attachTargetBody.UserData as Entity; Entity entity = attachTargetBody.UserData as Entity;
Submarine attachedSub = entity is Submarine ? (Submarine)entity : entity?.Submarine; Submarine attachedSub = entity is Submarine sub ? sub : entity?.Submarine;
if (attachedSub != null) if (attachedSub != null)
{ {
float velocity = attachedSub.Velocity == Vector2.Zero ? 0.0f : attachedSub.Velocity.Length(); float velocity = attachedSub.Velocity == Vector2.Zero ? 0.0f : attachedSub.Velocity.Length();
@@ -209,6 +209,7 @@ namespace Barotrauma
//isActive = false; //isActive = false;
bool spawnReady = false;
if (spawnPending) if (spawnPending)
{ {
//wait until there are no submarines at the spawnpos //wait until there are no submarines at the spawnpos
@@ -219,25 +220,31 @@ namespace Barotrauma
if (Vector2.DistanceSquared(submarine.WorldPosition, spawnPos) < minDist * minDist) return; if (Vector2.DistanceSquared(submarine.WorldPosition, spawnPos) < minDist * minDist) return;
} }
spawnPending = false;
//+1 because Range returns an integer less than the max value //+1 because Range returns an integer less than the max value
int amount = Rand.Range(minAmount, maxAmount + 1, Rand.RandSync.Server); int amount = Rand.Range(minAmount, maxAmount + 1, Rand.RandSync.Server);
monsters = new Character[amount]; monsters = new List<Character>();
float offsetAmount = spawnPosType == Level.PositionType.MainPath ? 1000 : 100;
for (int i = 0; i < amount; i++) for (int i = 0; i < amount; i++)
{ {
bool isClient = false; CoroutineManager.InvokeAfter(() =>
{
bool isClient = false;
#if CLIENT #if CLIENT
isClient = GameMain.Client != null; isClient = GameMain.Client != null;
#endif #endif
monsters.Add(Character.Create(characterFile, spawnPos + Rand.Vector(offsetAmount, Rand.RandSync.Server), i.ToString(), null, isClient, true, true));
monsters[i] = Character.Create( if (monsters.Count == amount)
characterFile, spawnPos + Rand.Vector(100.0f, Rand.RandSync.Server), {
i.ToString(), null, isClient, true, true); spawnReady = true;
}
}, Rand.Range(0f, amount / 2, Rand.RandSync.Server));
} }
spawnPending = false;
} }
if (!spawnReady) { return; }
Entity targetEntity = Submarine.FindClosest(GameMain.GameScreen.Cam.WorldViewCenter); Entity targetEntity = Submarine.FindClosest(GameMain.GameScreen.Cam.WorldViewCenter);
#if CLIENT #if CLIENT
if (Character.Controlled != null) targetEntity = (Entity)Character.Controlled; if (Character.Controlled != null) targetEntity = (Entity)Character.Controlled;
@@ -150,9 +150,6 @@ namespace Barotrauma
public bool EnableMouseLook { get; set; } = true; public bool EnableMouseLook { get; set; } = true;
public bool CrewMenuOpen { get; set; } = true;
public bool ChatOpen { get; set; } = true;
private bool unsavedSettings; private bool unsavedSettings;
public bool UnsavedSettings public bool UnsavedSettings
{ {
@@ -850,9 +847,6 @@ namespace Barotrauma
AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", AimAssistAmount); AimAssistAmount = doc.Root.GetAttributeFloat("aimassistamount", AimAssistAmount);
EnableMouseLook = doc.Root.GetAttributeBool("enablemouselook", EnableMouseLook); EnableMouseLook = doc.Root.GetAttributeBool("enablemouselook", EnableMouseLook);
CrewMenuOpen = doc.Root.GetAttributeBool("crewmenuopen", CrewMenuOpen);
ChatOpen = doc.Root.GetAttributeBool("chatopen", ChatOpen);
foreach (XElement subElement in doc.Root.Elements()) foreach (XElement subElement in doc.Root.Elements())
{ {
switch (subElement.Name.ToString().ToLowerInvariant()) switch (subElement.Name.ToString().ToLowerInvariant())
@@ -1028,9 +1022,7 @@ namespace Barotrauma
new XAttribute("requiresteamauthentication", requireSteamAuthentication), new XAttribute("requiresteamauthentication", requireSteamAuthentication),
new XAttribute("autoupdateworkshopitems", AutoUpdateWorkshopItems), new XAttribute("autoupdateworkshopitems", AutoUpdateWorkshopItems),
new XAttribute("aimassistamount", aimAssistAmount), new XAttribute("aimassistamount", aimAssistAmount),
new XAttribute("enablemouselook", EnableMouseLook), new XAttribute("enablemouselook", EnableMouseLook));
new XAttribute("chatopen", ChatOpen),
new XAttribute("crewmenuopen", CrewMenuOpen));
if (!ShowUserStatisticsPrompt) if (!ShowUserStatisticsPrompt)
{ {
@@ -44,7 +44,6 @@ namespace Barotrauma
base.Deselect(); base.Deselect();
#if CLIENT #if CLIENT
GameMain.Config.SaveNewPlayerConfig();
GameMain.SoundManager.SetCategoryMuffle("default", false); GameMain.SoundManager.SetCategoryMuffle("default", false);
GUI.ClearMessages(); GUI.ClearMessages();
#endif #endif