/// <summary> /// Signals a Dialog to all listeners. (usually a UI) /// </summary> /// <param name="info">The dialog info to pass along.</param> public void SignalDialog(VMDialogInfo info) { if (OnDialog != null) { OnDialog(info); } }
/// <summary> /// Signals a Dialog to all listeners. (usually a UI) /// </summary> /// <param name="info">The dialog info to pass along.</param> public void SignalDialog(VMDialogInfo info) { if (Driver.InResync) { return; } OnDialog?.Invoke(info); }
public static void ShowDialog(VMStackFrame context, VMDialogOperand operand, STR source) { VMDialogInfo info = new VMDialogInfo { Block = (operand.Flags & VMDialogFlags.Continue) == 0, Caller = context.Caller, Icon = context.StackObject, Operand = operand, Message = ParseDialogString(context, source.GetString(Math.Max(0, operand.MessageStringID - 1)), source), Title = (operand.TitleStringID == 0) ? "" : ParseDialogString(context, source.GetString(operand.TitleStringID - 1), source), IconName = (operand.IconNameStringID == 0) ? "" : ParseDialogString(context, source.GetString(operand.IconNameStringID - 1), source), Yes = (operand.YesStringID == 0) ? null : ParseDialogString(context, source.GetString(operand.YesStringID - 1), source), No = (operand.NoStringID == 0) ? null : ParseDialogString(context, source.GetString(operand.NoStringID - 1), source), Cancel = (operand.CancelStringID == 0) ? null : ParseDialogString(context, source.GetString(operand.CancelStringID - 1), source), }; context.VM.SignalDialog(info); }
private void Client_OnDisconnect() { #if DEBUG //switch to server mode for debug purposes VMDialogInfo info = new VMDialogInfo { Caller = null, Icon = null, Operand = new VMDialogOperand { }, Message = "You have disconnected from the server. Simulation is continuing locally for debug purposes.", Title = "Disconnected!" }; VMHook.SignalDialog(info); VMHook.ReplaceNet(new VMServerDriver(37564, null)); #else if (OnStateChange != null) { OnStateChange(4, (float)CloseReason); } #endif }
public void Tick() { #if IDE_COMPAT if (ThreadBreak == VMThreadBreakMode.Pause) { return; } else if (ThreadBreak == VMThreadBreakMode.Reset) { Entity.Reset(Context); ThreadBreak = VMThreadBreakMode.Active; } else if (ThreadBreak == VMThreadBreakMode.Immediate) { Breakpoint(Stack.LastOrDefault(), "Paused."); return; } if (RoutineDirty) { foreach (var frame in Stack) { if (frame.Routine.Chunk.RuntimeVer != frame.Routine.RuntimeVer) { frame.Routine = Context.VM.Assemble(frame.Routine.Chunk); } } RoutineDirty = false; } #endif if (BlockingState != null) { BlockingState.WaitTime++; } if (DialogCooldown > 0) { DialogCooldown--; } #if !THROW_SIMANTICS try { #endif if (!Entity.Dead) { if (QueueDirty) { EvaluateQueuePriorities(); TryRunImmediately(); QueueDirty = false; } if (Stack.Count == 0) { if (IsCheck) { return; //running out of execution means check trees have ended. } Entity.ExecuteEntryPoint(1, Context, false); if (Stack.Count == 0) { return; } } if ((!Stack.LastOrDefault().ActionTree) || (!Queue[0].Callee.Dead)) //main or our target is not dead { #if IDE_COMPAT if (ThreadBreak == VMThreadBreakMode.ReturnTrue) { var bf = Stack[BreakFrame]; HandleResult(bf, bf.GetCurrentInstruction(), VMPrimitiveExitCode.RETURN_TRUE); Breakpoint(Stack.LastOrDefault(), "Returned True."); return; } if (ThreadBreak == VMThreadBreakMode.ReturnFalse) { var bf = Stack[BreakFrame]; HandleResult(bf, bf.GetCurrentInstruction(), VMPrimitiveExitCode.RETURN_TRUE); Breakpoint(Stack.LastOrDefault(), "Returned False."); return; } #endif ContinueExecution = true; while (ContinueExecution) { if (TicksThisFrame++ > MAX_LOOP_COUNT) { throw new Exception("Thread entered infinite loop! ( >" + MAX_LOOP_COUNT + " primitives)"); } ContinueExecution = false; NextInstruction(); } } else //interaction owner is dead, rip { Entity.Reset(Context); } } #if !THROW_SIMANTICS } catch (Exception e) { #if IDE_COMPAT if (!IsCheck && VM.SignalBreaks) { Breakpoint(Stack.LastOrDefault(), "!" + e.Message + " " + StackTraceSimplify(e.StackTrace.Split('\n').FirstOrDefault(x => x.Contains(".cs")) ?? "")); ContinueExecution = false; return; } #endif if (e is ThreadAbortException) { throw e; } if (Stack.Count == 0) { return; } var context = Stack[Stack.Count - 1]; bool Delete = ((Entity is VMGameObject) && (DialogCooldown > 30 * 20 - 10)); if (DialogCooldown == 0) { var simExcept = new VMSimanticsException(e.Message + StackTraceSimplify(e.StackTrace.Split('\n').FirstOrDefault(x => x.Contains(".cs")) ?? ""), context); string exceptionStr = "A SimAntics Exception has occurred, and has been suppressed: \r\n\r\n" + simExcept.ToString() + "\r\n\r\nThe object will be reset. Please report this!"; VMDialogInfo info = new VMDialogInfo { Caller = null, Icon = context.Callee, Operand = new VMDialogOperand { }, Message = exceptionStr, Title = "SimAntics Exception!" }; Context.VM.SignalDialog(info); DialogCooldown = 30 * 20; } if (!IsCheck) { context.Callee.Reset(context.VM.Context); context.Caller.Reset(context.VM.Context); if (Delete) { Entity.Delete(true, context.VM.Context); } } else { Stack.Clear(); } } #endif }
public void Tick() { if (ThreadBreak == VMThreadBreakMode.Pause) { return; } else if (ThreadBreak == VMThreadBreakMode.Immediate) { Breakpoint(Stack.LastOrDefault()); return; } if (RoutineDirty) { foreach (var frame in Stack) { if (frame.Routine.Chunk.RuntimeVer != frame.Routine.RuntimeVer) { frame.Routine = Context.VM.Assemble(frame.Routine.Chunk); } } RoutineDirty = false; } if (DialogCooldown > 0) { DialogCooldown--; } //#if !DEBUG try { //#endif if (!Entity.Dead) { EvaluateQueuePriorities(); if (Stack.Count == 0) { if (Queue.Count == 0) { //todo: should restart main return; } var item = Queue[0]; if (item.Cancelled) { Entity.SetFlag(VMEntityFlags.InteractionCanceled, true); } if (IsCheck || (item.Mode != VMQueueMode.ParentIdle || !Entity.GetFlag(VMEntityFlags.InteractionCanceled))) { ExecuteAction(item); } else { Queue.RemoveAt(0); return; } } if (!Queue[0].Callee.Dead) { if (ThreadBreak == VMThreadBreakMode.ReturnTrue) { var bf = Stack[BreakFrame]; HandleResult(bf, bf.GetCurrentInstruction(), VMPrimitiveExitCode.RETURN_TRUE); Breakpoint(Stack.LastOrDefault()); return; } if (ThreadBreak == VMThreadBreakMode.ReturnFalse) { var bf = Stack[BreakFrame]; HandleResult(bf, bf.GetCurrentInstruction(), VMPrimitiveExitCode.RETURN_TRUE); Breakpoint(Stack.LastOrDefault()); return; } ContinueExecution = true; var interaction = Queue[0]; while (ContinueExecution) { ContinueExecution = false; NextInstruction(); } //clear "interaction cancelled" if we're going into the next action. if (Stack.Count == 0 && interaction.Mode != VMQueueMode.ParentIdle) { Entity.SetFlag(VMEntityFlags.InteractionCanceled, false); } } else //interaction owner is dead, rip { Stack.Clear(); if (Queue[0].Callback != null) { Queue[0].Callback.Run(Entity); } if (Queue.Count > 0) { Queue.RemoveAt(0); } } } else { Queue.Clear(); } //#if !DEBUG } catch (Exception e) { var context = Stack[Stack.Count - 1]; bool Delete = ((Entity is VMGameObject) && (DialogCooldown > 30 * 20 - 10)); if (DialogCooldown == 0) { var simExcept = new VMSimanticsException(e.Message, context); string exceptionStr = "A SimAntics Exception has occurred, and has been suppressed: \r\n\r\n" + simExcept.ToString() + "\r\n\r\nThe object will be reset. Please report this!"; VMDialogInfo info = new VMDialogInfo { Caller = null, Icon = context.Callee, Operand = new VMDialogOperand { }, Message = exceptionStr, Title = "SimAntics Exception!" }; Context.VM.SignalDialog(info); DialogCooldown = 30 * 20; } context.Callee.Reset(context.VM.Context); context.Caller.Reset(context.VM.Context); if (Delete) { Entity.Delete(true, context.VM.Context); } } //#endif //Interrupt = true; }
/// <summary> /// Signals a Dialog to all listeners. (usually a UI) /// </summary> /// <param name="info">The dialog info to pass along.</param> public void SignalDialog(VMDialogInfo info) { OnDialog?.Invoke(info); }