public void Invoke(WorldSession session, MethodCall methodCall, CodedInputStream stream) { var request = (IMessage)Activator.CreateInstance(requestType); request.MergeFrom(stream); BattlenetRpcErrorCode status; if (responseType != null) { var response = (IMessage)Activator.CreateInstance(responseType); status = (BattlenetRpcErrorCode)methodCaller.DynamicInvoke(session, request, response); Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server Method: {1}) Returned: {2} Status: {3}.", session.GetRemoteAddress(), request, response, status); if (status == 0) { session.SendBattlenetResponse(methodCall.GetServiceHash(), methodCall.GetMethodId(), methodCall.Token, response); } else { session.SendBattlenetResponse(methodCall.GetServiceHash(), methodCall.GetMethodId(), methodCall.Token, status); } } else { status = (BattlenetRpcErrorCode)methodCaller.DynamicInvoke(session, request); Log.outDebug(LogFilter.ServiceProtobuf, "{0} Client called server Method: {1}) Status: {2}.", session.GetRemoteAddress(), request, status); if (status != 0) { session.SendBattlenetResponse(methodCall.GetServiceHash(), methodCall.GetMethodId(), methodCall.Token, status); } } }