public void runCommandLoop() {
   while (true) {
     int cmd = readInt();
     if (cmd == -1) {
       loader.init(); // init
       intercom_return();
     } else if (cmd == -2) {
       // shutdown
       intercom_return();
       return;
     } else // callback
     {
       CallbackInfo cb = callbacks.get(cmd);
       ArrayList<Object> args = new ArrayList<Object>();
       for (InterprocType type : cb.getTypes()) {
         switch (type) {
           case boolType:
             args.add(readBool());
             break;
           case int8:
             args.add(readByte());
             break;
           case int16:
             args.add(readShort());
             break;
           case int32:
             args.add(readInt());
             break;
           case int64:
             args.add(readLong());
             break;
           case floatType:
             args.add(readFloat());
             break;
           case string:
             args.add(readString());
             break;
         }
       }
       boolean retval = false;
       try {
         retval = (Boolean) cb.getMethod().invoke(cb.getObject(), args.toArray());
       } catch (Throwable e) {
         logger_log(
             LogType.LOG_CRITICAL,
             "msJavaPlugin-java",
             "An unhandled exception was thrown in a callback function.");
         PrintWriter pw = new PrintWriter(new StringWriter());
         e.printStackTrace(pw);
         logger_log(LogType.LOG_CRITICAL, "msJavaPlugin-java", pw.toString());
       }
       intercom_return(retval);
     }
   }
 }
 public void plugin_addCallback(String hookID, Object obj, Method method) {
   /*
   string HookID
   int32 function id
   int32 argument count
   int8 type of arg1
   ...
   int8 type of argn
   */
   CallbackInfo cb = new CallbackInfo(obj, method);
   writeInt(ClientCommand.plugin_addCallback.ordinal());
   writeString(hookID);
   writeInt(cb.getIndex()); // function id
   writeInt(method.getParameterTypes().length); // argument count
   // argument types
   writeArgTypes(cb.getTypes());
   callbacks.add(cb);
 }