ItsDeltin / Overwatch-Script-To-Workshop

Converts scripts to Overwatch workshops.
208 stars 26 forks source link

Exception when invoking a random lambda from an array. #396

Closed rlenhub closed 2 years ago

rlenhub commented 2 years ago

Workshop Output:

An exception was thrown while translating to workshop.
System.NullReferenceException: Object reference not set to an instance of an object.
   at Deltin.Deltinteger.Parse.Lambda.Workshop.LambdaBuilder.GetCompatibleLambda(InstanceAnonymousTypeLinker typeLinker, IWorkshopPortableFunctionIdentifier portableFunction) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Lambda\Workshop\PortableBuilder.cs:line 41
   at Deltin.Deltinteger.Parse.Lambda.Workshop.LambdaBuilder.GetIdentifier(ActionSet actionSet, IWorkshopPortableFunctionIdentifier portableFunction) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Lambda\Workshop\PortableBuilder.cs:line 33
   at Deltin.Deltinteger.Parse.Lambda.Workshop.CaptureEncoder.Encode(ActionSet actionSet, CallMethodGroup methodGroup) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Lambda\Workshop\CaptureEncoder.cs:line 38
   at Deltin.Deltinteger.Parse.CreateArrayAction.Parse(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Expression.cs:line 134
   at Deltin.Deltinteger.Parse.VariableInstance.VariableInstanceOption.GetValue(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\User\VarInstance.cs:line 84
   at Deltin.Deltinteger.Parse.Functions.Builder.Virtual.MacroContentBuilder.OnlyOne() in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Functions\Builder\Virtual\MacroContentBuilder.cs:line 30
   at Deltin.Deltinteger.Parse.Functions.Builder.Virtual.AbstractVirtualContentBuilder`1.Build() in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Functions\Builder\Virtual\AbstractVirtualContentBuilder.cs:line 27
   at Deltin.Deltinteger.Parse.VariableInstance.ToMacro(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\User\VarInstance.cs:line 76
   at Deltin.Deltinteger.Parse.CallVariableAction.Parse(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\Semantics\CallVariableAction.cs:line 23
   at Deltin.Deltinteger.Parse.IInvokeResult.GetParameterValuesAsWorkshop(ActionSet actionSet, IInvokeResult invokeResult) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Functions\Semantics\IInvokeInfo.cs:line 173
   at Deltin.Deltinteger.Parse.FunctionInvokeResult.Parse(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Functions\Semantics\IInvokeInfo.cs:line 215
   at Deltin.Deltinteger.Parse.TypeOperation.Resolve(ActionSet actionSet, IExpression left, IExpression right) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Types\Operators\ITypeOperation.cs:line 56
   at Deltin.Deltinteger.Parse.IInvokeResult.GetParameterValuesAsWorkshop(ActionSet actionSet, IInvokeResult invokeResult) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Functions\Semantics\IInvokeInfo.cs:line 173
   at Deltin.Deltinteger.Parse.FunctionInvokeResult.Parse(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Functions\Semantics\IInvokeInfo.cs:line 215
   at Deltin.Deltinteger.Parse.CallVariableAction.Parse(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\Semantics\CallVariableAction.cs:line 25
   at Deltin.Deltinteger.Parse.DataTypeAssigner.GetResult(GettableAssignerValueInfo info) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\GettableAssigners\DataTypeAssigner.cs:line 54
   at Deltin.Deltinteger.Parse.IGettableAssigner.GetValue(GettableAssignerValueInfo info) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\GettableAssigners\IGettableAssigner.cs:line 64
   at Deltin.Deltinteger.Parse.DefineAction.Translate(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Variables\Semantics\DefineAction.cs:line 23
   at Deltin.Deltinteger.Parse.BlockAction.Translate(ActionSet actionSet) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Block.cs:line 36
   at Deltin.Deltinteger.Parse.DeltinScript.ToWorkshop(Func`2 addRules) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Translate.cs:line 259
   at Deltin.Deltinteger.Parse.DeltinScript..ctor(TranslateSettings translateSettings) in C:\Users\HDdel\Documents\GitHub\Overwatch-Script-To-Workshop\Deltinteger\Deltinteger\Parse\Translate.cs:line 57

main.del:

void ExampleMutation_Init() {
    PlayerEnter = (players) => {
        // Do a thing
    };

    PlayerExit = (players) => {
        // Revert the previous thing
    };

    PlayerTick = (players) => {
        // Do a thing every tick
    };

    FixedTickRate = 2;
}

globalvar (() => void)[] MUTATIONS: [
    ExampleMutation_Init
];

globalvar Boolean EnableZone = false;

globalvar Any MainEffect = null; // Ring effect.
globalvar Any[] AdditionalEffects = []; // Other effects created by some mutations.

globalvar Player[] PlayersInside = []; // All players currently inside zone.

globalvar (Player[]) => void PlayerEnter; // Callback when player enters the zone.
globalvar (Player[]) => void PlayerExit; // Callback when player exits the zone.
globalvar (Player[]) => void PlayerTick; // Callback when player loiters in the zone.
globalvar () => void Cleanup; // Callback when the zone is about to be deleted.

globalvar Number FixedTickRate = 60; // Number of tick calls per second.

rule: 'On Game In Progress - Enable Mutation Zone.'
Event.OngoingGlobal 
if(IsGameInProgress()) {
    Wait(30);
    EnableZone = true;
}

rule: 'While Zone Enabled - Maintain Mutation Zone.'
Event.OngoingGlobal
if(EnableZone) {
    // Pick random mutation and initialize it.
    () => void mutation = MUTATIONS[RandomInteger(0, CountOf(MUTATIONS) - 1)];
    mutation.Invoke();
    // Create ring effect and store it.
    CreateEffect(AllPlayers(), Effect.Ring, Color.Violet, ObjectivePosition(ObjectiveIndex()), 21.444);
    MainEffect = LastCreatedEntity();
    // Clean up after 30 seconds.
    Wait(30.0, WaitBehavior.AbortWhenFalse);
    Cleanup.Invoke();
    PlayerEnter = null;
    PlayerExit = null;
    PlayerTick = null;
    // Wait 10 seconds before creating another one.
    Wait(10.0, WaitBehavior.AbortWhenFalse);
    LoopIfConditionIsTrue();
}

rule: 'While Zone Enabled - Update PlayersInside'
Event.OngoingGlobal
if(EnableZone) {
    // Report all players within the radius.
    Player[] newRadiusCheck = PlayersWithinRadius(ObjectivePosition(ObjectiveIndex()), 21.444, Team.All, RadiusLOS.Off);

    // Track all new players.
    Player[] playersEntered = newRadiusCheck.FilteredArray((player) => {
        return !PlayersInside.Contains(player);
    });

    // Track all leaving players.
    Player[] playersExited = PlayersInside.FilteredArray((player) => {
        return !newRadiusCheck.Contains(player);
    });

    // Do the callbacks.
    PlayerEnter.Invoke(playersEntered);
    PlayerExit.Invoke(playersExited);

    // Update PlayersInside.
    PlayersInside = newRadiusCheck;

    // Do it again.
    MinWait();
    LoopIfConditionIsTrue();
}

rule: 'Run Zone Tick'
Event.OngoingGlobal
if(EnableZone) {
    PlayerTick.Invoke(PlayersInside);
    Wait(1 / FixedTickRate);
    LoopIfConditionIsTrue();
}
ItsDeltin commented 2 years ago

Thanks! Fixed in 2.5