public int D20QueryItem(GameObject item, D20DispatcherKey queryKey)
    {
        var dispIo = new DispIoD20Query();

        dispIo.obj = item;
        DispatchForItem(item, DispatcherType.D20Query, queryKey, dispIo);
        return(dispIo.return_val);
    }
    public int D20QueryPython(GameObject obj, string queryKey, object arg)
    {
        var dispatcher = obj.GetDispatcher();

        if (dispatcher == null)
        {
            return(0);
        }

        var dispIo = new DispIoD20Query();

        dispIo.return_val = 0;
        dispIo.obj        = arg;
        dispatcher.Process(DispatcherType.PythonQuery, (D20DispatcherKey)ElfHash.Hash(queryKey), dispIo);
        return(dispIo.return_val);
    }
    public ulong D20QueryReturnData(GameObject obj, D20DispatcherKey queryKey, int arg1 = 0, int arg2 = 0)
    {
        Trace.Assert(queryKey != D20DispatcherKey.QUE_Critter_Is_Charmed &&
                     queryKey != D20DispatcherKey.QUE_Critter_Is_Afraid &&
                     queryKey != D20DispatcherKey.QUE_Critter_Is_Held);

        var dispatcher = obj.GetDispatcher();

        if (dispatcher == null)
        {
            return(0);
        }

        var dispIO = new DispIoD20Query();

        dispIO.return_val = 0;
        dispIO.data1      = arg1;
        dispIO.data2      = arg2;
        dispatcher.Process(DispatcherType.D20Query, queryKey, dispIO);

        return(dispIO.resultData);
    }
    public GameObject D20QueryReturnObject(GameObject obj, D20DispatcherKey queryKey,
                                           int arg1 = 0, int arg2 = 0)
    {
        Trace.Assert(queryKey == D20DispatcherKey.QUE_Critter_Is_Charmed ||
                     queryKey == D20DispatcherKey.QUE_Critter_Is_Afraid ||
                     queryKey == D20DispatcherKey.QUE_Critter_Is_Held);

        var dispatcher = obj.GetDispatcher();

        if (dispatcher == null)
        {
            return(null);
        }

        var dispIO = new DispIoD20Query();

        dispIO.return_val = 0;
        dispIO.data1      = arg1;
        dispIO.data2      = arg2;
        dispatcher.Process(DispatcherType.D20Query, queryKey, dispIO);

        return((GameObject)dispIO.obj);
    }