d38c50c...f202506

commit f20250657eda223fddacf812a477727b1a2b507b
Author: Joonas Rikkonen <poe.regalis@gmail.com>
Date:   Wed Mar 20 16:50:39 2019 +0200

    Ending a campaign round by talking to watchman doesn't require any special permissions. Closes #1313
This commit is contained in:
Joonas Rikkonen
2019-03-20 16:51:22 +02:00
parent a8309b5766
commit e8025cc66e
3 changed files with 36 additions and 9 deletions
@@ -93,7 +93,6 @@ namespace Barotrauma
} }
} }
protected override void WatchmanInteract(Character watchman, Character interactor) protected override void WatchmanInteract(Character watchman, Character interactor)
{ {
if ((watchman.Submarine == Level.Loaded.StartOutpost && !Submarine.MainSub.AtStartPosition) || if ((watchman.Submarine == Level.Loaded.StartOutpost && !Submarine.MainSub.AtStartPosition) ||
@@ -107,8 +106,7 @@ namespace Barotrauma
return; return;
} }
if (GameMain.Client != null && interactor == Character.Controlled && if (GameMain.Client != null && interactor == Character.Controlled)
(GameMain.Client.HasPermission(ClientPermissions.ManageRound) || GameMain.Client.HasPermission(ClientPermissions.ManageCampaign)))
{ {
var msgBox = new GUIMessageBox("", TextManager.Get("CampaignEnterOutpostPrompt") var msgBox = new GUIMessageBox("", TextManager.Get("CampaignEnterOutpostPrompt")
.Replace("[locationname]", Submarine.MainSub.AtStartPosition ? Map.CurrentLocation.Name : Map.SelectedLocation.Name), .Replace("[locationname]", Submarine.MainSub.AtStartPosition ? Map.CurrentLocation.Name : Map.SelectedLocation.Name),
@@ -123,7 +121,6 @@ namespace Barotrauma
}; };
msgBox.Buttons[0].OnClicked += msgBox.Close; msgBox.Buttons[0].OnClicked += msgBox.Close;
msgBox.Buttons[1].OnClicked += msgBox.Close; msgBox.Buttons[1].OnClicked += msgBox.Close;
} }
} }
@@ -72,6 +72,27 @@ namespace Barotrauma
}); });
} }
public bool AllowedToEndRound(Character interactor)
{
if (interactor == null || Level.Loaded?.StartOutpost == null || Level.Loaded?.EndOutpost == null)
{
return false;
}
if (interactor.Submarine == Level.Loaded.StartOutpost &&
interactor.CanInteractWith(startWatchman))
{
return true;
}
if (interactor.Submarine == Level.Loaded.EndOutpost &&
interactor.CanInteractWith(endWatchman))
{
return true;
}
return false;
}
protected override void WatchmanInteract(Character watchman, Character interactor) protected override void WatchmanInteract(Character watchman, Character interactor)
{ {
if ((watchman.Submarine == Level.Loaded.StartOutpost && !Submarine.MainSub.AtStartPosition) || if ((watchman.Submarine == Level.Loaded.StartOutpost && !Submarine.MainSub.AtStartPosition) ||
@@ -85,8 +106,7 @@ namespace Barotrauma
if (GameMain.Server != null) if (GameMain.Server != null)
{ {
var client = GameMain.Server.ConnectedClients.Find(c => c.Character == interactor); var client = GameMain.Server.ConnectedClients.Find(c => c.Character == interactor);
hasPermissions = client != null && hasPermissions = client != null;
(client.HasPermission(ClientPermissions.ManageRound) || client.HasPermission(ClientPermissions.ManageCampaign));
CreateDialog(new List<Character> { watchman }, hasPermissions ? "WatchmanInteract" : "WatchmanInteractNotAllowed", 1.0f); CreateDialog(new List<Character> { watchman }, hasPermissions ? "WatchmanInteract" : "WatchmanInteractNotAllowed", 1.0f);
} }
} }
@@ -995,7 +995,17 @@ namespace Barotrauma.Networking
return; return;
} }
if (!sender.HasPermission(command)) //clients are allowed to end the round by talking with the watchman in multiplayer
//campaign even if they don't have the special permission
if (command == ClientPermissions.ManageRound && inc.PeekBoolean() &&
GameMain.GameSession?.GameMode is MultiPlayerCampaign mpCampaign)
{
if (!mpCampaign.AllowedToEndRound(sender.Character))
{
return;
}
}
else if (!sender.HasPermission(command))
{ {
Log("Client \"" + sender.Name + "\" sent a server command \"" + command + "\". Permission denied.", ServerLog.MessageType.ServerMessage); Log("Client \"" + sender.Name + "\" sent a server command \"" + command + "\". Permission denied.", ServerLog.MessageType.ServerMessage);
return; return;