0

I just got done adding Xbox support code to my project, and have run into at least two issues.

The first involves save data sync which is working just fine, however when the game reads the user's login data on Windows it behaves as if login has not been completed - no gamertag is displayed in the corner, and the login provider throws error 0x87DD0005 regardless of the number of retry attempts.

Execution of the code is just fine on Xbox - only Windows seems to be affected by this. I'm also targeting the creator's showcase initially (or at least until I can get to where I'm ready for another run at ID@Xbox) so achievements and the like aren't a concern right now.

The following is the code I'm using (and in no particular order):

public void doStartup()
{
   getData(-1);
   for (int i = 0; i <= 5; i++)
   {
      getData(i);
   }
   ContentViewport.Source = new Uri("ms-appx-web:///logo.html");
}

public async void getData(int savefileId)
{
   var users = await Windows.System.User.FindAllAsync();

   string c_saveBlobName = "Advent";
   //string c_saveContainerDisplayName = "GameSave";
   string c_saveContainerName = "file" + savefileId;
   if (savefileId == -1) c_saveContainerName = "config";
   if (savefileId == 0) c_saveContainerName = "global";
   GameSaveProvider gameSaveProvider;

   GameSaveProviderGetResult gameSaveTask = await GameSaveProvider.GetForUserAsync(users[0], "00000000-0000-0000-0000-00006d0be05f");
   //Parameters
   //Windows.System.User user
   //string SCID

   if (gameSaveTask.Status == GameSaveErrorStatus.Ok)
   {
      gameSaveProvider = gameSaveTask.Value;
   }
   else
   {
      return;
      //throw new Exception("Game Save Provider Initialization failed");;
   }

   //Now you have a GameSaveProvider
   //Next you need to call CreateContainer to get a GameSaveContainer

   GameSaveContainer gameSaveContainer = gameSaveProvider.CreateContainer(c_saveContainerName);
   //Parameter
   //string name (name of the GameSaveContainer Created)

   //form an array of strings containing the blob names you would like to read.
   string[] blobsToRead = new string[] { c_saveBlobName };

   // GetAsync allocates a new Dictionary to hold the retrieved data. You can also use ReadAsync
   // to provide your own preallocated Dictionary.
   GameSaveBlobGetResult result = await gameSaveContainer.GetAsync(blobsToRead);

   string loadedData = "";

   //Check status to make sure data was read from the container
   if (result.Status == GameSaveErrorStatus.Ok)
   {
      //prepare a buffer to receive blob
      IBuffer loadedBuffer;

      //retrieve the named blob from the GetAsync result, place it in loaded buffer.
      result.Value.TryGetValue(c_saveBlobName, out loadedBuffer);

      if (loadedBuffer == null)
      {

         //throw new Exception(String.Format("Didn't find expected blob \"{0}\" in the loaded data.", c_saveBlobName));

      }
      DataReader reader = DataReader.FromBuffer(loadedBuffer);
      loadedData = reader.ReadString(loadedBuffer.Length);
      if (savefileId == -1)
      {
         try
         {
            System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\config.json", loadedData);
         }
         catch { }
      }
      else if (savefileId == 0)
      {
         try
         {
            System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\global.json", loadedData);
         }
         catch { }
      }
      else
      {
         try
         {
            System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\file" + savefileId + ".json", loadedData);
         }
         catch { }

      }

   }
}
public async void InitializeXboxGamer()
{
   try
   {
      XboxLiveUser user = new XboxLiveUser();
      if (user.IsSignedIn == false)
      {
         SignInResult result = await user.SignInSilentlyAsync(Window.Current.Dispatcher);
         if (result.Status == SignInStatus.UserInteractionRequired)
         {
            result = await user.SignInAsync(Window.Current.Dispatcher);
         }
      }
      System.IO.File.WriteAllText(ApplicationData.Current.TemporaryFolder.Path + "\\curUser.txt", user.Gamertag);
      doStartup();
   }
   catch (Exception ex)
   {
      // TODO: log an error here
   }
}
TheGeneral
  • 79,002
  • 9
  • 103
  • 141
  • [0x87DD0005](https://www.google.com/search?q=0x87DD0005&rlz=1C1CHBF_en-GBAU822AU822&oq=0x87DD0005&aqs=chrome..69i57j0j0i30j0i5i30j69i60.453j0j7&sourceid=chrome&ie=UTF-8) – TheGeneral Oct 22 '20 at 04:00
  • Thanks for the thought, but I'm talking about this from a developer's point of view. That's not to say that your response ain't valid (since it could point me in the direction that I require) and I haven't been observing this in any of my other games either. – Jeffrey Davis Oct 22 '20 at 04:23
  • Yeah, there is a lot of info to trawl through, although not development specific. – TheGeneral Oct 22 '20 at 04:27
  • I also noticed that the code isn't writing the user information to disk like it's supposed to. That and it only seems to happen on Windows (and not Xbox). – Jeffrey Davis Oct 22 '20 at 13:07
  • I have another concern on this matter now: currently the startup routine writes all of the required files to get this to work, however the error message doesn't interrupt the startup routines at the moment. – Jeffrey Davis Oct 23 '20 at 13:55
  • I finally fixed the startup process by combining the bootloader call with the login call (previously they were in completely separate subroutines) however I still have the error message to deal with. File read/write is also resolved so data loading is not an issue either. Any advice would be appreciated. – Jeffrey Davis Oct 23 '20 at 20:09
  • Another update: it is now working on Xbox, but Windows is still having problems. – Jeffrey Davis Oct 23 '20 at 23:02
  • I would put a small bounty on this, but you need to add all the relevant information, also it wont be eligible for another 24 hours – TheGeneral Oct 23 '20 at 23:03
  • Will do. I'll go ahead and update the code portion to include the entire logic flow, beginning at login and onward to the start of game load. (EDIT: It's up!) – Jeffrey Davis Oct 23 '20 at 23:13
  • Another question I have is if either publishing status levels or pre-release matter in this case. Since the game is not yet up for sale (as I'm still testing things out and the story is not yet complete, plus I'm totally new at this as well) I'm not exactly sure if that would affect anything. (Also, I used one of my unlock codes so I could verify the issue on a separate account and the problem is also present in that case.) – Jeffrey Davis Oct 24 '20 at 15:06
  • Another question. Do the platform support settings have any effect? Originally I was building separate versions between Windows and Xbox to accommodate the JavaScript core but ultimately switched entirely to using the same build on both sides. I'm not at a point where this will answer my own question until I verify, but I'm kinda thinking that it might have something to do with this. – Jeffrey Davis Oct 26 '20 at 23:44
  • Update: it DID relate to my support settings. I have now officially changed this, resubmitted and it works flawlessly. – Jeffrey Davis Oct 27 '20 at 00:21

1 Answers1

1

I finally managed to figure out why the Xbox was working but Windows was not: it was a platform support issue. In the game's creator's dashboard for Xbox Live there's a settings window that allows the support of the game to be determined. Because I originally had separate builds for Xbox and Windows, only the Xbox support item was checked, so I went ahead and also checked off for Desktop support. After saving the changes, I resubmitted with the new configuration and now it works properly.