public static void FetchMission(int missionId) { EconomyScript.Instance.ClientConfig.MissionId++; if (missionId < 0) // debug clear. { Sandbox.Game.MyVisualScriptLogicProvider.SetQuestlogVisible(false); } MissionBaseStruct currentMission = EconomyScript.Instance.ClientConfig.Missions.FirstOrDefault(m => m.MissionId == missionId); if (currentMission == null) missionId = -1; EconomyScript.Instance.ClientConfig.MissionId = missionId; EconomyScript.Instance.ClientConfig.LazyMissionText = currentMission?.GetName(); if (currentMission == null) { //Sandbox.Game.MyVisualScriptLogicProvider.SetQuestlogVisible(false); } else { Sandbox.Game.MyVisualScriptLogicProvider.SetQuestlog(true, currentMission.GetName()); Sandbox.Game.MyVisualScriptLogicProvider.AddQuestlogDetail(currentMission.GetDescription()); } }
private static void RemoveMission(MissionBaseStruct mission) { using (ExecutionLock.AcquireExclusiveUsing()) { EconomyScript.Instance.Data.Missions.Remove(mission); } }
public static void FetchMission(int missionId) { EconomyScript.Instance.ClientConfig.MissionId++; MissionBaseStruct currentMission = EconomyScript.Instance.ClientConfig.Missions.FirstOrDefault(m => m.MissionId == missionId); if (currentMission == null) { missionId = -1; } EconomyScript.Instance.ClientConfig.MissionId = missionId; EconomyScript.Instance.ClientConfig.LazyMissionText = currentMission == null ? null : currentMission.GetName(); }
public static void SendMissionComplete(MissionBaseStruct mission) { mission.RemoveGps(); EconomyScript.Instance.ClientConfig.Missions.Remove(mission); ConnectionHelper.SendMessageToServer(new MessageMission { CommandType = PlayerMissionManage.MissionComplete, Mission = mission }); string msg = mission.GetSuccessMessage(); if (mission.Reward != 0) { msg += string.Format("\r\n{0} {1} Transferred to your account.", mission.Reward, EconomyScript.Instance.ClientConfig.CurrencyName); } MyAPIGateway.Utilities.ShowMissionScreen("Mission:" + mission.MissionId, "", "Completed", msg, null, "Okay"); }
private static MissionBaseStruct CreateMission(MissionBaseStruct mission, ulong assignToPlayer) { using (ExecutionLock.AcquireExclusiveUsing()) { int newMissionId = 1; if (EconomyScript.Instance.Data.Missions.Count != 0) { newMissionId = EconomyScript.Instance.Data.Missions.Max(m => m.MissionId) + 1; } mission.MissionId = newMissionId; mission.PlayerId = assignToPlayer; EconomyScript.Instance.Data.Missions.Add(mission); } return(mission); }
public static void UpdateMission() { if (!(EconomyScript.Instance.ClientConfig?.ServerConfig?.EnableMissions ?? false)) return; ClientConfig clientConfig = EconomyScript.Instance.ClientConfig; // client config has not been received from server yet. if (clientConfig?.Missions == null) return; // if the player does not have a controlable body yet, no point continuing. if (MyAPIGateway.Session.Player.Controller == null || MyAPIGateway.Session.Player.Controller.ControlledEntity == null || MyAPIGateway.Session.Player.Controller.ControlledEntity.Entity == null) return; if (clientConfig.ClientHudSettings.ShowFaction) { Vector3D position = MyAPIGateway.Session.Player.Controller.ControlledEntity.Entity.GetPosition(); string faction = "Free agent"; IMyFaction plFaction; plFaction = MyAPIGateway.Session.Factions.TryGetPlayerFaction(MyAPIGateway.Session.Player.IdentityId); if (plFaction != null) { faction = plFaction.Name; //should this show tag or full name? depends on screen size i suppose } } //mission system /* Mission system will use a set of conditions which are set on commencement of mission. conditions not used are nul * target location eg 1000,1000,1000 * target player eg xphoenixxx * target trade zone eg Trader * target ship/station id? destruction or capture/rename would end the mission (much like beacons becoming unlinked on trade zones) * target event eg buy/sell/pay/drop/collect/kill?/capture? * target reward eg 1000 credits or 100 missile crates etc or a prefab id * Lazy missiontext is only using mission hud id 0 or 1 at the moment and changing the text based on clientConfig.missionid and active conditions * this allows us to use the internal hud mission ids with increment for more complex mission chains (eg patrol points multiple objectives etc) * or skip it entirely for single objective missions (eg deliver x item to y location) * on top of this we can use a pick-a-path or choose your own adventure style system where we substitute page number with missionID - * these style missions will be partially fixed by loading from a mission file allowing admins to design their own story missions * hard coded missions could be the emergency restock contracts which trigger automatically/randomly as stock levels plummet contracts could work as a * seperate system as hud space is limited. eg /contracts or we could work it in as a mission chain under main mission system * this allows for very complicated missions to be assembled using quite simple code (i like simple i understand simple!) * we need to save clientConfig.missionid client side so players can continue missions * if conditions are encoded in hud mission text, we could save that too and restore on rejoin Below are some sample example missions showing a few standard mission types which could be used in a tutorial chain - or auto generated - or created by server admins from a custom mission file. */ //int MissionPayment = 0; MissionBaseStruct currentMission = EconomyScript.Instance.ClientConfig.Missions.FirstOrDefault(m => m.MissionId == clientConfig.MissionId); // no mission currently selected. or no valid mission selected. if (currentMission == null) return; bool success = currentMission.CheckMission(); if (success) { clientConfig.SeenBriefing = false; //reset the check that tests if player has seen briefing and/or had gps created already clientConfig.CompletedMissions++; //increment the completed missions counter (note this is not intended to be 'current' mission just a counter) //it will probably only be used for current mission "chain" tracking later on if (clientConfig.CompletedMissions >= 3) { //demo mission chain is over clean up unnecessary hud sections we added earlier clientConfig.ClientHudSettings.ShowContractCount = false; clientConfig.ClientHudSettings.ShowPosition = false; } MessageMission.SendMissionComplete(currentMission); clientConfig.LazyMissionText = clientConfig.MissionId + " Mission: completed"; // TODO: is a bad idea to increment. We need to fetch the next valid mission, or reset to blank. //FetchMission(-1); FetchMission(0); //FetchMission(clientConfig.MissionId + 1); UpdateHud(); } }
public override void ProcessServer() { // update our own timestamp here AccountManager.UpdateLastSeen(SenderSteamId, SenderLanguage); EconomyScript.Instance.ServerLogger.WriteVerbose("Manage Player Mission from '{0}'", SenderSteamId); switch (CommandType) { case PlayerMissionManage.Test: //EconomyScript.Instance.ServerLogger.WriteVerbose("Mission Text request '{0}' from '{1}'", MissionID, SenderSteamId); MessageClientTextMessage.SendMessage(SenderSteamId, "mission", (MissionId + " server side")); break; case PlayerMissionManage.AddSample: { var player = MyAPIGateway.Players.FindPlayerBySteamId(SenderSteamId); var playerMatrix = player.Character.WorldMatrix; //var position = player.Character.GetPosition(); Vector3D position = playerMatrix.Translation + playerMatrix.Forward * 60f; MissionBaseStruct newMission = CreateMission(new TravelMission { AreaSphere = new BoundingSphereD(position, 50), //AreaSphere = new BoundingSphereD(new Vector3D(0, 0, 0), 50), Reward = 100, }, SenderSteamId); ConnectionHelper.SendMessageToPlayer(SenderSteamId, new MessageMission { CommandType = PlayerMissionManage.AddMission, Mission = newMission }); } break; case PlayerMissionManage.AddMission: // Nothing should happen here, because the server sends missions to the client, not the other way. break; case PlayerMissionManage.SyncMission: // TODO: sync details back from the client to the server. break; case PlayerMissionManage.DeleteMission: // TODO: Delete the mission. break; case PlayerMissionManage.MissionComplete: // This should process the mission reward if appropriate and then delete from server. // We aren't archiving finished missions. MissionBaseStruct serverinstanceMission = GetMission(Mission.MissionId); if (serverinstanceMission != null && serverinstanceMission.PlayerId == SenderSteamId) { var player = MyAPIGateway.Players.FindPlayerBySteamId(SenderSteamId); if (player != null) { // we look up our bank record based on our Steam Id/ // create balance if not one already, then add our reward and update client. var myaccount = AccountManager.FindOrCreateAccount(SenderSteamId, player.DisplayName, SenderLanguage); EconomyScript.Instance.Data.CreditBalance -= serverinstanceMission.Reward; myaccount.BankBalance += serverinstanceMission.Reward; myaccount.Date = DateTime.Now; MessageUpdateClient.SendAccountMessage(myaccount); } RemoveMission(serverinstanceMission); } break; } }