public object RemoteFunctionCall(object[] args) { float receiverIndex = (int)ReturnValueConversions.SafeUnwrap <float>(args, 0); string functionName = ReturnValueConversions.SafeUnwrap <string>(args, 1); if (args [2].GetType() != typeof(SortedDictionary <KeyWrapper, object>)) { throw new Error("Argument array to " + functionName + " is not an array"); } var argsAsReturnValues = ReturnValueConversions.SafeUnwrap <SortedDictionary <KeyWrapper, object> >(args, 2); if (_caller.connectedTings.Length == 0) { _caller.Say("No connected object to call function on", ""); return(0f); } if (receiverIndex == -1) { _caller.Say("Connection not open, can't call function.", ""); return(0f); } else if (receiverIndex < 0) { _caller.Say("Receiver index is below 0: " + receiverIndex, ""); return(0f); } else if (receiverIndex >= _caller.connectedTings.Length) { _caller.Say("Receiver index is too big (" + _caller.connectedTings.Length + ")", ""); return(0f); } MimanTing receiverTing = _caller.connectedTings[(int)receiverIndex]; receiverTing.PrepareForBeingHacked(); if (receiverTing.programs.Length == 0) { _caller.Say("Connected thing has no programs to call", ""); return(0f); } var fixedArgs = argsAsReturnValues.Values.ToArray(); receiverTing.masterProgram.StartAtFunctionIfItExists(functionName, fixedArgs, _program); _program.waitingForInput = true; return(0f); // "WAITING FOR RETURN VALUE FROM REMOTE FUNCTION"; }
private void SetHandItem(MimanTing pNewHandItem) { if (pNewHandItem == null) { D.Log ("pNewHandItem is null!"); return; } if (handItem != null) { MoveHandItemToInventoryForcefully (); if(onNewHandItem != null) { onNewHandItem("", false); } } handItem = pNewHandItem; handItem.isBeingHeld = true; handItem.PrepareForBeingHacked(); // this will make drinks generate programs if they don't have them already (happens when they are made by vending machines). if(onNewHandItem != null) { onNewHandItem(handItem.name, false); } }
private int RemoteFunctionCall(float receiverIndex, string functionName, object [] arguments) { var argsAsReturnValues = new object[arguments.Length]; int i = 0; foreach (object o in arguments) { if (o is float) { argsAsReturnValues[i] = (float)o; } else if (o is string) { argsAsReturnValues[i] = (string)o; } else if (o is bool) { argsAsReturnValues[i] = (bool)o; } else { throw new Exception("Can't handle argument to remote function call."); } i++; } if (_caller.connectedTings.Length == 0) { _caller.Say("No connected object to call function on", ""); return(0); } if (receiverIndex == -1) { _caller.Say("Connection not open, can't call function.", ""); return(0); } else if (receiverIndex < 0) { _caller.Say("Receiver index is below 0: " + receiverIndex, ""); return(0); } else if (receiverIndex >= _caller.connectedTings.Length) { _caller.Say("Receiver index is too big (" + _caller.connectedTings.Length + ")", ""); return(0); } MimanTing receiverTing = _caller.connectedTings[(int)receiverIndex]; receiverTing.PrepareForBeingHacked(); if (receiverTing.programs.Length == 0) { _caller.Say("Connected thing has no programs to call", ""); return(0); } //Program.OnProgramEndsReturnValue onReturnHandler = OnReturnValue; receiverTing.masterProgram.StartAtFunctionIfItExists(functionName, argsAsReturnValues, _program); _program.waitingForInput = true; return(0); // "WAITING FOR RETURN VALUE FROM REMOTE FUNCTION"; }
public void Hack(MimanTing pHackableTing) { if(pHackableTing == null) { D.Log("Hackable ting of " + name + " was null!"); return; } if(hackdev == null) { D.Log(name + " has got no hackdev to hack with"); return; } //logger.Log("Going to hack " + pHackableTing.name); if (pHackableTing != handItem) { FaceTing (pHackableTing); } pHackableTing.PrepareForBeingHacked(); if (pHackableTing == hackdev) { _worldSettings.Notify (name, "Modifier can't modify itself"); } else if(pHackableTing.programs.Length > 0) { MockProgram receiver = new MockProgram (retVal => { //D.Log("Got response from hackdev Allow function: " + retVal); if(retVal.GetType() == typeof(bool) && ((bool)retVal) == true) { StartAction("Hacking", pHackableTing, LONG_TIME, LONG_TIME); _dialogueRunner.EventHappened(name + "_hack_" + pHackableTing.name); } else { D.Log("Hacking not allowed with current device for character " + name); _worldSettings.Notify(name, "Not allowed with current device"); StopAction(); } }); StartAction("AttemptHacking", pHackableTing, 1.0f, 1.0f); pHackableTing.PrepareForBeingHacked (); hackdev.PrepareForBeingHacked (); if (hackdev.masterProgram.HasFunction ("Allow", true)) { hackdev.masterProgram.StartAtFunctionWithMockReceiver ("Allow", new object[] { pHackableTing.name, (float)pHackableTing.securityLevel }, receiver); } else { _worldSettings.Notify(name, "No Allow-function in " + hackdev.name); } } else { _worldSettings.Notify(name, "No programs to hack in " + pHackableTing.name); StopAction(); } }