95 lines
3.4 KiB
C#
95 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Xml.Linq;
|
|
using Barotrauma.Networking;
|
|
using Microsoft.Xna.Framework;
|
|
|
|
namespace Barotrauma
|
|
{
|
|
class MissionAction : EventAction
|
|
{
|
|
[Serialize("", true)]
|
|
public string MissionIdentifier { get; set; }
|
|
|
|
[Serialize("", true)]
|
|
public string MissionTag { get; set; }
|
|
|
|
private bool isFinished;
|
|
|
|
public MissionAction(ScriptedEvent parentEvent, XElement element) : base(parentEvent, element)
|
|
{
|
|
if (string.IsNullOrEmpty(MissionIdentifier) && string.IsNullOrEmpty(MissionTag))
|
|
{
|
|
DebugConsole.ThrowError($"Error in event \"{parentEvent.Prefab.Identifier}\": neither MissionIdentifier or MissionTag has been configured.");
|
|
}
|
|
if (!string.IsNullOrEmpty(MissionIdentifier) && !string.IsNullOrEmpty(MissionTag))
|
|
{
|
|
DebugConsole.ThrowError($"Error in event \"{parentEvent.Prefab.Identifier}\": both MissionIdentifier or MissionTag have been configured. The tag will be ignored.");
|
|
}
|
|
}
|
|
|
|
public override bool IsFinished(ref string goTo)
|
|
{
|
|
return isFinished;
|
|
}
|
|
public override void Reset()
|
|
{
|
|
isFinished = false;
|
|
}
|
|
|
|
public override void Update(float deltaTime)
|
|
{
|
|
if (isFinished) { return; }
|
|
|
|
if (GameMain.GameSession.GameMode is CampaignMode campaign)
|
|
{
|
|
MissionPrefab prefab = null;
|
|
if (!string.IsNullOrEmpty(MissionIdentifier))
|
|
{
|
|
prefab = campaign.Map.CurrentLocation.UnlockMissionByIdentifier(MissionIdentifier);
|
|
}
|
|
else if (!string.IsNullOrEmpty(MissionTag))
|
|
{
|
|
prefab = campaign.Map.CurrentLocation.UnlockMissionByTag(MissionTag);
|
|
}
|
|
if (campaign is MultiPlayerCampaign mpCampaign)
|
|
{
|
|
mpCampaign.LastUpdateID++;
|
|
}
|
|
|
|
if (prefab != null)
|
|
{
|
|
#if CLIENT
|
|
new GUIMessageBox(string.Empty, TextManager.GetWithVariable("missionunlocked", "[missionname]", prefab.Name),
|
|
new string[0], type: GUIMessageBox.Type.InGame, icon: prefab.Icon, relativeSize: new Vector2(0.3f, 0.15f), minSize: new Point(512, 128))
|
|
{
|
|
IconColor = prefab.IconColor
|
|
};
|
|
#else
|
|
NotifyMissionUnlock(prefab);
|
|
#endif
|
|
}
|
|
}
|
|
isFinished = true;
|
|
}
|
|
|
|
public override string ToDebugString()
|
|
{
|
|
return $"{ToolBox.GetDebugSymbol(isFinished)} {nameof(MissionAction)} -> ({(string.IsNullOrEmpty(MissionIdentifier) ? MissionTag : MissionIdentifier)})";
|
|
}
|
|
|
|
#if SERVER
|
|
private void NotifyMissionUnlock(MissionPrefab prefab)
|
|
{
|
|
foreach (Client client in GameMain.Server.ConnectedClients)
|
|
{
|
|
IWriteMessage outmsg = new WriteOnlyMessage();
|
|
outmsg.Write((byte) ServerPacketHeader.EVENTACTION);
|
|
outmsg.Write((byte) EventManager.NetworkEventType.MISSION);
|
|
outmsg.Write(prefab.Identifier);
|
|
GameMain.Server.ServerPeer.Send(outmsg, client.Connection, DeliveryMethod.Reliable);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
} |