package me.hammerle.snuviscript.code; import me.hammerle.snuviscript.inputprovider.InputProvider; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Stack; import java.util.function.Consumer; import me.hammerle.snuviscript.exceptions.PreScriptException; import me.hammerle.snuviscript.exceptions.StackTrace; import me.hammerle.snuviscript.inputprovider.ReturnWrapper; import me.hammerle.snuviscript.tokenizer.Tokenizer; import me.hammerle.snuviscript.inputprovider.Variable; import me.hammerle.snuviscript.instructions.Instruction; import me.hammerle.snuviscript.instructions.UserFunction; public final class Script { private static int idCounter = 0; private final int id; private final String name; private final ScriptManager scriptManager; private int lineIndex = 0; private final Instruction[] code; private final Stack dataStack = new Stack<>(); private final Stack returnStack = new Stack<>(); private final HashMap labels = new HashMap<>(); private final HashMap> localLabels = new HashMap<>(); private final HashMap vars = new HashMap<>(); private final Stack> localVars = new Stack<>(); private final HashMap functions = new HashMap<>(); private Stack ifState = new Stack<>(); private Stack inFunction = new Stack<>(); private Stack returnVarPop = new Stack<>(); // waiting scripts stop executing and run again on an event private boolean isWaiting; // holded scripts do not receive events private boolean isHolded; private boolean stackTrace; private HashSet loadedEvents = new HashSet<>(); private final Consumer