openplanet Download Openplanet Login with ManiaPlanet

Printing the amount of planets

As an example, we will print to console how many planets you have. The amount of planets happens to be in the CGamePlayerProfileChunk_AccountSettings class. If you take a look at CGameCtnApp, you will find that the path from game app to planets is: app.CurrentProfile.AccountSettings.OnlinePlanets

The most basic code to print this value would thus be:

void Main()
{
  CGameCtnApp@ app = GetApp();
  uint planets = app.CurrentProfile.AccountSettings.OnlinePlanets;
  print("You have " + planets + " planets.");
}

If you reload this script ingame, it will print the amount of planets:

[   ScriptRuntime] [13:08:14] You have 438818 planets.

Of course, this script isn't great - it will throw a null reference exception if you just start the game, because CurrentProfile is null until you log in. So, to solve that, we should do a simple null check first:

void Main()
{
  CGameCtnApp@ app = GetApp();
  if (app.CurrentProfile !is null)
  {
    uint planets = app.CurrentProfile.AccountSettings.OnlinePlanets;
    print("You have " + planets + " planets.");
  }
}

Now it will only print the amount of planets if you reload when logged in. Of course, we can make this even better, by waiting until the player has logged in. Due to the nature of yieldable functions, we can do this pretty easily with a while loop:

void Main()
{
  CGameCtnApp@ app = GetApp();

  while (app.CurrentProfile is null) {
    yield();
  }

  uint planets = app.CurrentProfile.AccountSettings.OnlinePlanets;
  print("You have " + planets + " planets.");
}

Note that we're using is here, and not ==. That's because CurrentProfile is a handle type, which is denoted by the @ sign after the type name. Since Angelscript has no pointer dereference operator like C++ has with ->, we'll have separate operators for handles and handle values. For this reason, we separate the is and == operators when working with handles.

For example, if we use obj == null on a handle type, it will actually be rewritten by Angelscript internally as obj.opEquals(null) so that the == operator can be overloaded by the object's class. Therefore, if obj is already null here, it will throw a null reference exception. To actually check if the handle itself is null, we use the is operator, like obj is null.