Getting Script Classes

In AngelScript you can access Postal3Script attributes from one way to another, but you can also do the same thing with AngelScript classes.

However there are 3 downsides:

  • The script class must be cached, otherwise it won't work
  • Casting must be done manually, because AngelScript cannot do it automatically
  • The only way to detect if it's cached (or wrong) is to check if the script object is null or not

We'll use GetScriptObj for this.

Example: (from PC, modified)

class PCMonitor : IPostal3Script
{
    CP3SObj@ self;
    int iMaxSkins;
}

class PC : IPostal3Script
{
    // Dummy
    void Init(){}

    CP3SObj@ self;

    // This must be declared as a handle!
    PCMonitor@ monitor;

    PC(CP3SObj@ obj)
    {
        @self = @obj;

        // Get the closest monitor to us after everything's loaded
        engine.DelayedExecution(0, "PC", "GetMonitor", self);
    }

    void GetMonitor()
    {
        CP3SObj@ mon = null;

        array<CP3SObj@> aNPC = engine.GetArrayOfEntitiesRadius(self, 96);
        for (uint i = 0; i < aNPC.length(); i++)
        {
            if ( @aNPC[i] == null )
                continue;

            if ( @aNPC[i] == @self )
                continue;

            if ( aNPC[i].GetBaseEntity().GetClassName() != "cr_prop_interactable" )
                continue;

            if ( aNPC[i].GetManner() != "PCMonitor" )
                continue;

            // We got ourselves a monitor, break!
            @mon = @aNPC[i];
            break;
        }

        // Failed to get a monitor
        if (@mon == null)
            return;

        // We'll now attempt getting the script class to the monitor we got earlier
        @monitor = cast<PCMonitor@>(GetScriptObj("PCMonitor", mon));

        // Class wasn't cached for some reason! 
        // (but it's also generally a good idea to do null checking)
        if (@monitor == null)
            return;

        // We can now access the variables... like this
        Printf("Monitor Max Skins: %d\n", monitor.iMaxSkins);

        // even all of it's handle objects
        if (@monitor.self != null)
            Printf("Monitor Faction: %s\n", monitor.self.GetFaction());
    }
}