Ejemplo n.º 1
0
        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());
            }
        }
Ejemplo n.º 2
0
 private static void RemoveMission(MissionBaseStruct mission)
 {
     using (ExecutionLock.AcquireExclusiveUsing())
     {
         EconomyScript.Instance.Data.Missions.Remove(mission);
     }
 }
Ejemplo n.º 3
0
        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();
        }
Ejemplo n.º 4
0
        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");
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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();
            }
        }
Ejemplo n.º 7
0
        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;
            }
        }